美文网首页
206. Reverse Linked List

206. Reverse Linked List

作者: 尚无花名 | 来源:发表于2019-04-20 19:51 被阅读0次

    翻转一个链表,这题至少有两种做法, 一个是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

          本文链接:https://www.haomeiwen.com/subject/dxnlgqtx.html