每日一题:反转链表

解题思路:

  1. 定义三个指针:prev、curr 和 next,分别表示当前节点的前一个节点、当前节点和下一个节点。
  2. 初始化 prev 为 None,curr 为链表的头节点。
  3. 遍历链表,对于每个节点:
  • 将当前节点的下一个节点保存为 next。
  • 将当前节点的指针指向前一个节点 prev,完成节点的反转。
  • 将 prev 更新为当前节点。
  • 将 curr 更新为下一个节点 next。
  1. 当遍历结束后,链表的头节点变为原链表的尾节点,所以将原链表的尾节点的指针指向 None。
  2. 返回反转后的链表的头节点,即原链表的尾节点。
    代码实现及注释:
class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next

def reverse_linked_list(head):
    prev = None  # 当前节点的前一个节点
    curr = head  # 当前节点
    
    while curr:
        next_node = curr.next  # 当前节点的下一个节点
        
        # 反转指针
        curr.next = prev  # 将当前节点的指针指向前一个节点
        
        # 更新指针位置
        prev = curr  # 更新前一个节点为当前节点
        curr = next_node  # 更新当前节点为下一个节点
    
    return prev  # 返回反转后的链表的头节点

# 测试
# 创建链表 1 -> 2 -> 3 -> 4 -> 5
head = ListNode(1)
head.next = ListNode(2)
head.next.next = ListNode(3)
head.next.next.next = ListNode(4)
head.next.next.next.next = ListNode(5)

# 反转链表
new_head = reverse_linked_list(head)

# 遍历打印反转后的链表
while new_head:
    print(new_head.val, end=" ")
    new_head = new_head.next
# 输出: 5 4 3 2 1

该算法的时间复杂度为 O(n),其中 n 是链表的长度。在算法的执行过程中,需要遍历一次链表,并对每个节点进行指针的反转操作。因此,总的时间复杂度是线性的。

猜你喜欢

转载自blog.csdn.net/qq_29669259/article/details/131592550