LeetCode——206. 反转链表

Posted 小萝卜鸭

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode——206. 反转链表相关的知识,希望对你有一定的参考价值。

反转一个单链表。

示例:

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

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

https://leetcode-cn.com/problems/reverse-linked-list/

迭代

思路是在原链表之前建立一个空的newHead,因为首节点会变,然后从head开始,将之后的一个节点移到newHead之后,重复此操作直到head成为末节点为止,代码如下:

c++

lass Solution {
public:
    ListNode* reverseList(ListNode* head) {
        ListNode *newHead = NULL;
        while (head) {
            ListNode *t = head->next;
            head->next = newHead;
            newHead = head;
            head = t;
        }
        return newHead;
    }
};

java

class Solution {
    public ListNode reverseList(ListNode head) {
        //申请节点,pre和 newHead,pre指向null
        ListNode pre = null;
        ListNode newHead = head;
        ListNode tmp = null;
        while(newHead!=null) {
            //记录当前节点的下一个节点
            tmp = newHead.next;
            //然后将当前节点指向pre
            newHead.next = pre;
            //pre和newHead节点都前进一位
            pre = newHead;
            newHead = tmp;
        }
        return pre;
    }
}

python

class Solution(object):
    def reverseList(self, head):
        # 申请两个节点,pre和 newHead,pre指向None
        pre = None
        newHead = head
        # 遍历链表,while循环里面的内容其实可以写成一行
        # 这里只做演示,就不搞那么骚气的写法了
        while newHead:
            # 记录当前节点的下一个节点
            tmp = newHead.next
            # 然后将当前节点指向pre
            newHead.next = pre
            # pre和newHead节点都前进一位
            pre = newHead
            newHead = tmp
        return pre  

递归

递归解法的思路是,不断的进入递归函数,直到head指向倒数第二个节点,因为head指向空或者是最后一个结点都直接返回了,

newHead则指向对head的下一个结点调用递归函数返回的头结点,此时newHead指向最后一个结点,然后head的下一个结点的next指向head本身,这个相当于把head结点移动到末尾的操作,

因为是回溯的操作,所以head的下一个结点总是在上一轮被移动到末尾了,但head之后的next还没有断开,所以可以顺势将head移动到末尾,再把next断开,最后返回newHead即可,代码如下:

c++

class Solution {
public:
    ListNode* reverseList(ListNode* head) {
        if (!head || !head->next) return head;
        ListNode *newHead = reverseList(head->next);
        head->next->next = head;
        head->next = NULL;
        return newHead;
    }
};

java

class Solution {
    public ListNode reverseList(ListNode head) {
        //递归终止条件是当前为空,或者下一个节点为空
        if(head==null || head.next==null) {
            return head;
        }
        //这里的newHead就是最后一个节点
        ListNode newHead = reverseList(head.next);
        //如果链表是 1->2->3->4->5,那么此时的newHead就是5
        //而head是4,head的下一个是5,下下一个是空
        //所以head.next.next 就是5->4
        head.next.next = head;
        //防止链表循环,需要将head.next设置为空
        head.next = null;
        //每层递归函数都返回newHead,也就是最后一个节点
        return newHead;
    }
}

python

class Solution(object):
    def reverseList(self, head):
        # 递归终止条件是当前为空,或者下一个节点为空
        if(head==None or head.next==None):
            return head
        # 这里的newHead就是最后一个节点
        newHead = self.reverseList(head.next)
        head.next.next = head
        # 防止链表循环,需要将head.next设置为空
        head.next = None
        # 每层递归函数都返回newHead,也就是最后一个节点
        return newHead

以上是关于LeetCode——206. 反转链表的主要内容,如果未能解决你的问题,请参考以下文章

剑指offerJZ15——反转链表。leetcode206.反转链表

LeetCode #206 链表反转

206. 反转链表

206. 反转链表

leetcode_数据结构_链表_206反转链表(重点:递归)

206. 反转链表(递归)