题目:定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
使用四指针来处理
- 当前节点
- 前一节点
- 后一节点
- 反转后的头节点(其实用可以化简)
一张图说清!
/**
* 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大佬王尼玛