LeetCode初级-反转链表

作者: 棒棒小糖 | 来源:发表于2019-01-24 14:09 被阅读2次

    题目:

    反转一个单链表。

    示例:

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

    进阶:
    你可以迭代或递归地反转链表。你能否用两种方法解决这道题?

    题目分析:

    参考的别人的,感觉很醍醐奶油灌顶喔(重要的是思想嘛

    用几张图来解释应该更加清晰,假设现在有一个链表是下图这样的。

    然后我们声明3个指针,一个指向当前节点, 一个指向当前节点的前一个节点,还有一个指向当前节点的后一个节点。

    重点看 while 循环中的内容:第一次循环后链表变成了这样,注意节点1指向了pre(也就是NULL),此时1和2断开了。(下面都用圈表示指针,虚线处说明断链了)

    没看明白?那再来一次,第二次循环过程中,current -> next = pre; 这句话让节点2指向了节点1,这时候2和3就断开了。

    然后执行 pre = current;current = next; 这两句话将pre指针前移到节点2,current指针前移到节点3,所以第二次循环完成后链表是这样的。

    如此循环下去,将链表指针一个一个指向前一个数,从而实现了链表反转的功能。

    注意:到最后一个数的时候,current和pre之间还是断开的,从上面的图也能看出来,每次循环完会有断链。所以最后用 current -> next = pre; 将链连起来。

    C++代码如下:

    /**
     * Definition for singly-linked list.
     * struct ListNode {
     *     int val;
     *     ListNode *next;
     *     ListNode(int x) : val(x), next(NULL) {}
     * };
     */
    class Solution {
    public:
        ListNode* reverseList(ListNode* head) {
            ListNode* current = head;
            ListNode* pre = NULL;
            ListNode* next = NULL;
            
            if (head == NULL) return head;
            while (current -> next) {
                next = current -> next;
                current -> next = pre;
                pre = current;
                current = next;
            }
            
            current -> next = pre;
            return current;
        }
    };
    

    相关文章

      网友评论

        本文标题:LeetCode初级-反转链表

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