剑指 Offer 24. 反转链表

73 阅读1分钟

剑指 Offer 24. 反转链表

image.png

# 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