blog/source/_posts/2020-03-18-leetcode-206.md
Ching 9690121403 feat(init project): add all existing files
add all existing files

Signed-off-by: Ching <loooching@gmail.com>
2022-02-02 19:04:18 +08:00

2.0 KiB
Raw Blame History

title date tags categories
leetcode-206 2020-03-18 23:33:03 leetcode

206. 反转链表

题目

最简单的思路是遍历链表一个列表去做存储,通过倒序读取列表的同时改写链表。

class ListNode:
    def __init__(self, x):
        self.val = x
        self.next = None

class Solution:
  def reverseList(self, head):
    if not head or not head.next:
      return head
    nl = []
    while head.next:
      nl.append(head)
      head = head.next
    nl.append(head)
    l = len(nl)
    for x in range(l):
      if x == 0:
        nl[x].next = None
        continue
      nl[x].next = nl[x-1]
      if x == (l - 1):
        return nl[x]

仔细想想自己又傻逼了,何必要遍历两次呢,在第一遍遍历的同时就能操作了:

class Solution:
  def reverseList(self, head):
    if not head or not head.next:
      return head
    prev_node = None
    next_node = head.next
    while head:
      next_node = head.next
      head.next = prev_node
      prev_node = head
      head = next_node
    return prev_node

然后是递归的做法,主要思路是一直进到最深一层--也就是链表的最后一个--的时候开始返回,同时修改那一层的两个 node。一开始踩了一个坑是返回了每一个node结果最后回到第一层的时候得到的是链表的末端其实只需要修改链表并不需要返回 node所以一开始到达链表末端的时候直接返回那一个node就可以了。

class Solution:
  def reverseList(self, head):
    if not head:
      return head
    if head.next:
      ss = Solution()
      last = ss.reverseList(head.next)
      head.next.next = head
      head.next = None
      return last
    return head

一开始是用list来打草稿不过想明白递归之后就大同小异了

def a(l:list)->list:
  k=[l[0]]

  if l[1:]:
    b=a(l[1:])
    b.extend(k)
  else:
    return [l[0]]
  return b