链表是一种数据结构,可以用一个常见的比喻来理解。想象一下,你有一串珠子,每个珠子上都有一个小标签,上面写了一些信息(比如数字或字母)。这些珠子通过一根线串在一起,每颗珠子都只知道自己后面紧挨着的那一颗珠子在哪里,而不知道其他珠子的位置。
具体来说:
- 头节点:就像这串珠子的第一颗珠子。
- 尾节点:就是最后一颗珠子,它没有后面的珠子相连。
- 节点:每一颗珠子就是一个节点,每个节点包含两部分:一部分是存储的信息(数据域),另一部分是指向下一个节点的指针(指针域)。
当你想要找到某个特定位置的珠子时,需要从第一颗珠子开始,沿着线依次查看每颗珠子上的标签,直到找到你要的那个。这种方式在某些情况下效率较低,因为可能需要检查很多个节点才能到达目标节点。但是,插入和删除操作相对简单快捷,因为只需要调整相邻节点之间的连接即可。
class ListNode(object):
"""
链表节点类,包含一个值和一个指向下一个节点的指针
"""
def __init__(self, val=0, next=None):
"""
初始化链表节点
:param val: 节点的值,默认为0
:param next: 下一个节点,默认为None
"""
self.val = val
self.next = next
class Solution(object):
"""
解决方案类,提供链表反转的功能
"""
def reverseList(self, head):
"""
反转链表
:type head: Optional[ListNode] 链表的头节点,可能为None
:rtype: Optional[ListNode] 反转后的链表头节点,可能为None
"""
prev = None # 初始化前一个节点指针为None
current = head # 初始化当前节点指针为链表头
print("初始状态: prev=None, current=", current, sep='')
while current:
next_node = current.next # 保存当前节点的下一个节点
print("当前节点:", current, "下一个节点:", next_node)
current.next = prev # 将当前节点的next指向前一个节点,实现反转
print("反转后: 当前节点的next指向前一个节点", prev)
prev = current # 前一个节点指针向后移动
print("更新: prev=", prev, "current=", next_node, sep='')
current = next_node # 当前节点指针向后移动
print("新的当前节点:", current)
return prev # 返回反转后的链表头
def print_linked_list(head):
"""
打印链表
:param head: ListNode 链表的头节点
"""
current = head
while current:
print(current.val, end=" ") # 打印当前节点的值
current = current.next # 移动到下一个节点
print() # 打印换行
if __name__ == "__main__":
# Create a linked list: 1 -> 2 -> 3 -> 4 -> 5
# 创建链表:1 -> 2 -> 3 -> 4 -> 5
node5 = ListNode(5, None)
node4 = ListNode(4, node5)
node3 = ListNode(3, node4)
node2 = ListNode(2, node3)
head = ListNode(1, node2)
print("原始链表:")
print_linked_list(head)
# Reverse the linked list
# 反转链表
solution = Solution()
reversed_head = solution.reverseList(head)
print("反转后的链表:")
print_linked_list(reversed_head)