206. Reverse Linked List

翻转一个链表,这题至少有两种做法, 一个是recursion, 一个是iterative的解法。
两种都要会。
对于链表问题,一定要画图。

先写recursion的

base case: 如果head == null || head.next == null, 这时返回head就好了。
正常case: 1-> 2 -> 3
让recursion去处理 2-3
把2的next接到1
把1的next接地。
然后返回2-3 他俩翻转后的head就好了
代码见下:

class Solution {
    public ListNode reverseList(ListNode head) {
        return recursionWay(head);
    }
    private ListNode recursionWay(ListNode head) {
        // base case
        if (head == null || head.next == null) return head;
        
        // 1 -> 2 -> 3 .  => 1,  2 -> 3
        ListNode realHead = recursionWay(head.next);
        head.next.next = head; // 2 -> 1
        head.next = null; // 1 -\> 2
        return realHead;
    }
}

C++版本

class Solution {
public:
    ListNode* reverseList(ListNode* head) {
        if (head == NULL || head->next == NULL) return head;
        ListNode* realHead = reverseList(head->next);
        head->next->next = head;
        head->next = NULL;
        return realHead;
    }
};

再写Iterative的

对于 1-> 2 -> 3这个例子, 就是借用一个prev变量来保留上一个node,
把当前node 的next指向prev, 更新prev和head,(同时要早早的把head.next保下来,否则丢了head)
最后返回prev。

class Solution {
    public ListNode reverseList(ListNode head) {
        // 1 -> 2 -> 3
        // prev <- 1, 
        // prev = 1, head = 2 -> 3
        ListNode prev = null;
        while (head != null) {
            ListNode next = head.next;
            head.next = prev;
            prev = head;
            head = next;
        }
        return prev;
    }
}

C++ 版本

class Solution {
public:
    ListNode* reverseList(ListNode* head) {
        ListNode* prev = NULL;
        while (head != NULL) {
            ListNode* next = head->next;
            head->next = prev;
            prev = head;
            head = next;
        }
        return prev;
    }
};

你可能感兴趣的:(206. Reverse Linked List)