- 题目描述
输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。
示例 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之后的节点。