题目
反转一个单链表。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
进阶:
你可以迭代或递归地反转链表。你能否用两种方法解决这道题?
迭代+双指针
从某公众号(代码随想录)搬过来的gif图:看了能很好地理解转置的过程
class Solution {
public:ListNode* reverseList(ListNode* head) {ListNode* pre = nullptr;ListNode* cur = head;ListNode* tmp;while(cur != NULL){//临时结点,暂存当前节点的下一个节点,用于后移tmp = cur->next;//当前节点指向它前面的节点(完成转置)cur->next = pre;//前指针后移pre = cur;//当前指针后移cur = tmp;}return pre;}
};
递归解
递归思路:
递归动态图:
主要思路:
head 的下一个节点指向head
具体实现步骤过程见:
https://leetcode-cn.com/problems/reverse-linked-list/solution/dong-hua-yan-shi-206-fan-zhuan-lian-biao-by-user74/
递归模板;
class Solution {
public:ListNode* reverseList(ListNode* head) {//终止条件://终止条件是当前节点或者下一个节点==null//终止条件为何是这个?第一个head是null,防止一开始传入的就是空指针//若一开始传入的就是空指针,则会返回空指针//若一开始传入的是head+null,则会直接返回head//若一开始传入的是head+node2+...+null,则正常递归返回if(head ==NULL || head->next == NULL){return head;}//调用递归+逻辑//在函数内部,改变节点的指向,也就是 head 的下一个节点指向 head 递归函数ListNode* cur = reverseList(head->next);head->next->next = head;//防止链表循环,需要将head.next设置为空,此时原来的head变为尾部head->next = NULL;return cur;}
};