码迷,mamicode.com
首页 > 其他好文 > 详细

LeetCode——206. 反转链表

时间:2020-03-02 13:02:26      阅读:40      评论:0      收藏:0      [点我收藏+]

标签:记录   one   调用   输出   代码   内容   python   ++   开始   

反转一个单链表。

示例:

输入: 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. 反转链表

标签:记录   one   调用   输出   代码   内容   python   ++   开始   

原文地址:https://www.cnblogs.com/wwj99/p/12394742.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!