LeetCode初级-反转链表

题目:

反转一个单链表。

示例:

输入: 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;
    }
};
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容