首页 > 其他分享 >206. 反转链表 (精选)

206. 反转链表 (精选)

时间:2023-11-18 21:13:09浏览次数:29  
标签:head ListNode val 206 反转 next 链表 now

2023-11-18

206. 反转链表 - 力扣(LeetCode)

思路:

注意leetcode是没有头节点的,只有数据节点

1 先将指针放到最后,然后从开头取节点,放到此节点后面 遍历2遍,不好

2 引入头节点,头插法 可以就用本来的链表 / 定义一个新的链表

3 原地反转链表的线

迭代(双指针)

递归 相当于1的思路

1简单,就没有代码了

2:

引入头节点的头插法(用本来链表);

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode reverseList(ListNode head) {
        //原地反转  双指针
        //递归
        //栈
        //引入头节点  头插法
 
 
        //引入头节点,头插法
 
        if(head==null || (head!=null && head.next==null)){
            return head;
        }
    
        ListNode l=new ListNode();
        l.next=head;
        
        ListNode now=head;
 
        while(now.next!=null){
            ListNode temp=now.next;
            now.next=now.next.next;
            temp.next=l.next;
            l.next=temp;
        }
 
        return l.next;
 
 
 
 
    }
}

定义新链表的头插法:

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode reverseList(ListNode head) {
        //注意leetcode是没有头节点的,只有数据节点
 
        //1 先将指针放到最后,然后从开头取节点,放到此节点后面     遍历2遍,不好
        //2 引入头节点,头插法       可以就用本来的链表 /   定义一个新的链表
        //3 原地反转链表的线
            //迭代
            //递归  /   循环
        
        ListNode  l=new ListNode();
 
        ListNode now=head;
        ListNode t;
        while(now!=null){
            t=now.next;
            now.next=l.next;
            l.next=now;
            now=t;
        }
 
        return l.next;
 
 
 
    }
}

3:

递归:

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode reverseList(ListNode head) {
        //注意leetcode是没有头节点的,只有数据节点
 
        //1 先将指针放到最后,然后从开头取节点,放到此节点后面     遍历2遍,不好
        //2 引入头节点,头插法       可以就用本来的链表 /   定义一个新的链表
        //3 原地反转链表的线
            //迭代
            //递归  /   循环
        
        
        //原地反转的递归写法        后面是反转完的,前面是待反转的,相当于先将指针指向最后
        if(head==null || head.next==null){
            return head;
        }
 
        ListNode newHead = reverseList(head.next);
        head.next.next = head;
        head.next = null;
        return newHead;
 
 
 
 
    }
}

迭代/双指针:

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode reverseList(ListNode head) {
        //原地反转  双指针
        //递归
        //栈
        //引入头节点  头插法
 
 
        //双指针
        if(head==null || (head!=null && head.next==null)){
            return head;
        }
 
        ListNode pre=null;
        ListNode now=head;
 
        ListNode temp;
        while(true){
            temp=now.next;
            now.next=pre;
            pre=now;
            if(temp==null){
                break;
            }
            now=temp;
        }
        
        return now;
 
 
 
    }
}

 

标签:head,ListNode,val,206,反转,next,链表,now
From: https://www.cnblogs.com/youye9527/p/17841116.html

相关文章

  • 【HDU 1276】士兵队列训练问题 题解(链表+模拟)
    某部队进行新兵队列训练,将新兵从一开始按顺序依次编号,并排成一行横队,训练的规则如下:从头开始一至二报数,凡报到二的出列,剩下的向小序号方向靠拢,再从头开始进行一至三报数,凡报到三的出列,剩下的向小序号方向靠拢,继续从头开始进行一至二报数。。。,以后从头开始轮流进行一至二报数、一至......
  • (链表)16-删除有序链表中重复的元素-b
    1importjava.util.*;23/*4*publicclassListNode{5*intval;6*ListNodenext=null;7*publicListNode(intval){8*this.val=val;9*}10*}11*/12publicclassSolution{13/**14*@paramhead......
  • (链表)10-相交链表
    1/*2publicclassListNode{3intval;4ListNodenext=null;56ListNode(intval){7this.val=val;8}9}*/10publicclassSolution{11publicListNodeFindFirstCommonNode(ListNodepHead1,ListNodepHead2)......
  • (链表)15-删除有序链表中的重复元素-a
    1importjava.util.*;23/*4*publicclassListNode{5*intval;6*ListNodenext=null;7*publicListNode(intval){8*this.val=val;9*}10*}11*/12publicclassSolution{13/**14*@paramhead......
  • 双向循环链表应用
    已知p指向双向循环链表中的一个结点,其结点结构为data、prior、next三个域,实现交换p所指向的结点和它的前缀结点的顺序。#include<iostream>#include<cstring>usingnamespacestd;typedefstructf{intdata;f*next;f*pre;}node,*Node;voidbuild(Nodep){int......
  • 链表逆置
     structListNode*reverse(structListNode*head){if(head==NULL||head->next==NULL){returnhead;}structListNode*p=NULL,*t,*pp=head;while(pp){t=pp->next;pp->next=p;p=pp;pp=t;}......
  • 151. 反转字符串中的单词
    2023-11-17思路:调用库函数+利用正则表达式利用栈双端队列头插链表利用数组总长度不知道按最大长度10^4利用list进阶:字符串可变时,Java不行,双指针,先整体反转,再逐个反转单词可以将空间复杂度降低 数组:classSolution{publicStringreverseWor......
  • (链表)14-链表的奇偶重排
    1importjava.util.*;23/*4*publicclassListNode{5*intval;6*ListNodenext=null;7*publicListNode(intval){8*this.val=val;9*}10*}11*/12publicclassSolution{13/**14*代码中的类名......
  • 多表查询(跨表查询) 子查询 链表查询 正反向查询概念 聚合查询 分组查询 F查询和Q查询
    昨日内容回顾模板之变量所有的数据类型都可以在模板中使用render(request,'index.html',context={''})render(request,'index.html',context=locals())"""在模板中使用变量的时候,用的是字典的key值,key值value值一般保持一致"""模板之过滤器类似于函数,函数才可以传递参......
  • 344. 反转字符串
    2023-11-16344.反转字符串-力扣(LeetCode)思路:        //栈    //头插链表    //o1 双指针双指针:classSolution{publicvoidreverseString(char[]s){//栈//头插链表//o1双指针inti=0;......