解题思路:
- 定义三个指针:prev、curr 和 next,分别表示当前节点的前一个节点、当前节点和下一个节点。
- 初始化 prev 为 None,curr 为链表的头节点。
- 遍历链表,对于每个节点:
- 将当前节点的下一个节点保存为 next。
- 将当前节点的指针指向前一个节点 prev,完成节点的反转。
- 将 prev 更新为当前节点。
- 将 curr 更新为下一个节点 next。
- 当遍历结束后,链表的头节点变为原链表的尾节点,所以将原链表的尾节点的指针指向 None。
- 返回反转后的链表的头节点,即原链表的尾节点。
代码实现及注释:
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 是链表的长度。在算法的执行过程中,需要遍历一次链表,并对每个节点进行指针的反转操作。因此,总的时间复杂度是线性的。