206. 反转链表 (精选)

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;
 
 
 
    }
}
复制代码

 

posted @   追梦•少年  阅读(7)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
点击右上角即可分享
微信分享提示