剑指offer——四指针解链表反转

题目:定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL

使用四指针来处理

  1. 当前节点
  2. 前一节点
  3. 后一节点
  4. 反转后的头节点(其实用可以化简)
    一张图说清!
    在这里插入图片描述
/**
 * 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* ReverseHead = nullptr;//反转后的头节点
        ListNode* cur = head;//当前节点
        ListNode* pre = nullptr;//前一个节点
        while(cur!=nullptr){
            ListNode* Next = cur->next;//下一个结点
            if(Next==nullptr)
                ReverseHead = cur;//找到反转后的头结点
            cur->next = pre;
            //将pre和cur都向前进一位
            //因为前面的操作会改变pre和cur,所以用这种间接方式来前进
            pre = cur;
            cur = Next;
        }
        return ReverseHead;
    }
};

其实要找的反转后的头节点就是操作之后的pre节点,所以可以再次化简!

class Solution {
public:
    ListNode* reverseList(ListNode* head) {
        ListNode* cur = head;//当前节点
        ListNode* pre = nullptr;//前一个节点
        while(cur!=nullptr){
            ListNode* Next = cur->next;//下一个结点
            cur->next = pre;
            //将pre和cur都向前进一位
            //因为前面的操作会改变pre和cur,所以用这种间接方式来前进
            pre = cur;
            cur = Next;
        }
        return pre;
    }
};

图源于LeetCode大佬王尼玛

发布了377 篇原创文章 · 获赞 344 · 访问量 17万+

猜你喜欢

转载自blog.csdn.net/qq_41895747/article/details/104850835