206. 反转链表

描述

反转一个单链表。

示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL

进阶:
你可以迭代或递归地反转链表。你能否用两种方法解决这道题?

思路1:双指针法(迭代)

设置一个临时结点指针tmp,用于保存当前结点改变指向后断开后的列表首元素,一前一后双指针,从头到尾移动。此方法简单。

解答1

/**
 * 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* tmp;
        ListNode* pre = NULL;
        ListNode* curr = head;//current代替head
        while(curr){
            tmp = curr->next;   //保存下一个节点     
            curr->next = pre;
            pre = curr;
            curr = tmp;
        }
        return pre;
    }
};

思路2:递归法

不得不说,这个方法太难理解了,只看代码绞尽脑汁我都想不出来过程…
推荐去LeetCode题解看此人的ppt,有递归的详细过程。
这里要注意两点:
(1)假设链表[1,2,3,4,5],最终触发第一行返回代码时,reverseList()函数返回的head是5,赋值给curr,后面每次返回的curr都是head=5这个结点。
(2)head->next->next这句,因为第5层(共5层)函数返回后,当前在第4层函数,当前head是4,所以head->next->next5->nexthead->next置空,防止链表更改指向后出现循环链表,若不置空最终递归反转完成链表后,新链表的最后两个节点会形成循环链表。

解答2

/**
 * 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* curr = reverseList(head->next);//curr保存终结点
        head->next->next = head;
        head->next = NULL;
        return curr;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值