zoukankan      html  css  js  c++  java
  • 剑指 Offer 06. 从尾到头打印链表

    • 题目描述

    输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。

    示例 1:

    输入:head = [1,3,2]
    输出:[2,3,1]

    限制:

    0 <= 链表长度 <= 10000

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/cong-wei-dao-tou-da-yin-lian-biao-lcof

    • 分析

    可使用单链表反转求解:

    单链表反转的过程参考博客:https://blog.csdn.net/weixin_39561100/article/details/79818949

     看不太懂,debug辅助理解下:

    class ListNode:
        def __init__(self, x):
            self.val = x
            self.next = None
    class Solution:
        # 返回ListNode
        def ReverseList(self, pHead):
            # write code here
            if pHead == None or pHead.next == None:
                return pHead
            cur = pHead
            tmp = None
            newhead = None
            newList = []
            while cur:
                tmp = cur.next #tmp指向cur后面的部分
                cur.next = newhead #这里将cur.next指向了newHead,我的理解是截断了cur后面的链表
                newhead = cur #将截断后的cur指向newhead
                cur = tmp #cur又指回原来的后面的部分
            while newhead:
                newList.append(newhead.val)
                newhead = newhead.next
            return newList
    s = Solution()
    l1 = ListNode(1)
    l1.next = ListNode(2)
    l1.next.next = ListNode(3)
    l1.next.next.next = ListNode(4)
    Phead = ListNode(l1)
    new = s.ReverseList(Phead.val)
    print(new)

    递归求解:

    递归求解真的花了我好久时间去理解。加入需要反转的链表为[1,2,3,4]

    递归的大致思路是反转[2,3,4],成为[4,3,2],然后再将1的head指向[4,3,2]。

    def ReverseList_r(self, pHead):
            if not pHead or not pHead.next:
                return pHead
            NewHead = self.ReverseList_r(pHead.next) #这里需要好好理解下NewHead,它一开始指向了4,后来其实是一直在改变4指向的新节点,和新节点指向的更新的节点
            pHead.next.next = pHead #这里的操作性相当于一开始pHead指向4,4指向None,这里改变4指向pHead(相当于指回去,反转回去这样)
            pHead.next = None  #然后取消掉后面循环指向,就只让4指向前面的3。
    return NewHead

    理解1:

    pHead.next.next = pHead
    pHead.next = None

    这里为什么要pHead的下一个节点的下一个节点指向自身,这里主要是为了让节点4反转回去指向之前的节点,然后由于这样指了回去其实就是一个循环的链表了会陷入死循环,因此将pHead的下一个节点指向了None,这里其实偷偷地将指针往前移动了,每次把next后面的指向空,每次拿进去反转的其实只有倒数的2个节点。

    理解2:

    NewHead到底指向的是什么:我的理解是一开始NewHead链接上了最后一个节点4,因此后面对节点4后面的操作就是每次修改4后面链接的节点,就是pHead.next=None之后的节点。

  • 相关阅读:
    Linux 安装网络yum地址
    MYSQL登录错误:mysqladmin: connect to server at ‘localhost’ failed
    linux 中截取字符串
    screen 调到后台使用
    Yum 安装memcached 与缓存清空
    LAMP 环境搭建
    DELL--R420 CPU报警“CPU0000 cpu2 internal error (IERR)contact support”
    解决vim粘贴时格式混乱的问题
    DELL 管理软件安装
    windows 使用SVN命令
  • 原文地址:https://www.cnblogs.com/yeshengCqupt/p/13392411.html
Copyright © 2011-2022 走看看