LeetCode 206 反转链表 题解

反转一个单链表。

示例:

输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL

经典题目。。分别用递归和循环实现。

1.循环,比较好理解。

LeetCode 206 反转链表 题解_第1张图片

首先定义三个指针代表三个节点(图第一步)。第一个指针pre,是用于把第二个指针cur指向它(反转)(图第二步),第三个指针next,是为了反转后,将第二个指针cur往后挪一挪(cur = next),当然同时另外两个指针都要一起挪一挪。如图的第三步。

然后注意循环结束条件,我这里写的是next != null,但是next == null的时候,情况是这样子的,如图

LeetCode 206 反转链表 题解_第2张图片

也就是说最后一次循环走不进去,但是还要把最后一个节点反转一下,所以return前需要 cur.next = pre ,在return cur回去。

代码:

class Solution {
    public ListNode reverseList(ListNode head) {
        if(head == null) return null;
        
        ListNode preNode = null;
        ListNode curNode = head;
        ListNode nextNode = head.next;
      
        while(nextNode != null){
            curNode.next = preNode;
            preNode = curNode;
            curNode = nextNode;
            nextNode = nextNode.next;
        }        
        curNode.next = preNode;
        return curNode;
    }
}

2.递归

class Solution {
    
    //代表将一个链表反转,并返回反转后的头部。
    public ListNode reverseList(ListNode head) {
        
        if(head == null) return null;  //输入为null的情况
        if(head.next == null) return head;     //递归到最后只有一个节点的情况,将自己返回去,该节点肯定为 每次递归结束后返回的头节点。
        
        ListNode headNode = reverseList(head.next);  //一直递归。对应上一行代码,每次返回的肯定都是同一个头结点,所以最后返回该节点
        
        ListNode curNode = headNode;              //对于每一层递归而言,需要将当前的head放到 反转后的链表 的后面,同时把他自己的指向置为null(ps:看了官方题解后,发现其实就是head.next.next = head(因为 当前head 其实还指向 反转后的链表 的尾部,只要将他们反指就好了)我是从头开始遍历找到最后一个节点,然后将 反转后的链表 的最后一个节点 指向 当前head,可能效率低了一点,)
        while(curNode.next != null){
            curNode = curNode.next;
        }                                                        //这几行 等同于 head.next.next = head,上面有解释原因。。
        curNode.next = head;
        head.next = null;
        
        return headNode;        
    }
}

 

LeetCode 206 反转链表 题解_第3张图片

 

ps:官方代码:

public ListNode reverseList(ListNode head) {
    if (head == null || head.next == null) return head;
    ListNode p = reverseList(head.next);
    head.next.next = head;
    head.next = null;
    return p;
}

 

你可能感兴趣的:(LeetCode刷题记录)