算法提高之LeetCode刷题

LeetCode初级-反转链表

2019-01-24  本文已影响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;
    }
};
上一篇下一篇

猜你喜欢

热点阅读