剑指 Offer 24. 反转链表
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
这个是单链表的定义。它包含两个属性:1. val: 当前节点的值。
2. next: 指向下一个节点的指针。如果是最后一个节点,next 就是 None。所以这个链表由多个 ListNode 节点组成,每个节点包含一个值和一个指向下一个节点的指针。比如一个链表:1 -> 2 -> 3 -> None可以表示为:
python
node1 = ListNode(1)
node2 = ListNode(2)
node3 = ListNode(3)
node1.next = node2
node2.next = node3
node3.next = None # 最后一个节点指向 None
利用切片
class Solution:
def reverseList(self, head: ListNode) -> ListNode:
while head is None:
return head
x=[]
kb=head
while kb is not None:
x.append(kb.val)
kb=kb.next
y=ListNode(x[-1])
head=y
for i in x[-2::-1]:
new_node=ListNode(i)
y.next=new_node
y=y.next
y.next=None
return head
这个实现思路比较巧妙,主要利用列表的弹出操作来构建反转链表。
但是相对来说,更直观的反转链表实现是直接遍历原链表,将每个节点的 next 指针反转指向前一个节点。两个实现的时间复杂度都是 O(n),空间复杂度这个实现是 O(n),直接翻转指针的实现是 O(1)。
直接反转链表
def reverseList(self, head: ListNode) -> ListNode:
x=head
y=None
while x:
z=x.next
x.next=y
y=x
x=z
return y