学习地址:https://www.cnblogs.com/wzw0625/p/12536744.html
题目描述
定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。
题目示例
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
解题思路
双指针:使用双指针pre和cur,分别表示当前节点的前一个结点和当前遍历的节点。具体操作定义临时指针tmp,用于存放当前指针cur所指的下一节点,即tmp = cur->next,然后让当前指针cur指向pre,再将cur的值交予pre,最后,将tmp赋值给cur,进行下一轮操作,直到cur到链表尾部。
代码:
/**
* 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) {
if(head == NULL) return head; //空链表
ListNode* pre = nullptr;
ListNode* cur = head;
while(cur != nullptr)
{
ListNode* tmp = cur->next;
cur->next = pre;
pre = cur;
cur = tmp;
}
return pre;
}
};
笔记:
双指针最终用**“pre”**作为头指针指向反转后的链表,因此返回pre指针即实现链表的反转;
递归法:
使用递归函数递归到链表的最后一个节点,将该节点作为反转后链表的头节点,然后,在每次函数返回过程中,让当前节点的下一节点的next指向当前节点,同时,让当前节点的next指向空,从而实现链表的反转操作。
代码:
/**
* 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) {
if(head == NULL || head->next == NULL) return head;
ListNode* rev = reverseList(head->next);
head->next->next = head;
head->next = NULL;
return rev;
}
};
笔记:
if(head == NULL || head->next == NULL) return head;
ListNode* rev = reverseList(head->next);
两条指令实现递归寻找链表的最后一个节点