目录
一、链表的Python实现
二、一个一个地添加节点,生成链表
三、用for循环一次性添加多个节点,生成链表
一、链表的Python实现
class ListNode:
'''这是链表类'''
def __init__(self,x):
# val属性是当前节点的值
self.val = x
# next属性是下一个节点,默认是None
self.next = None
二、一个一个地添加节点,生成链表
如果现在我想创建一个这样的链表:1->2->3->4->5->None,那么我可以用最简单的办法,一个节点一个节点地手动添加
# 创建头节点
linked = ListNode(1)
# 让头结点指向下一个节点
linked.next = ListNode(2)
# 继续往后面指,下同
linked.next.next = ListNode(3)
linked.next.next.next = ListNode(4)
linked.next.next.next.next = ListNode(5)
# 打印
print(linked.val,end='')
print('->',end='')
print(linked.next.val,end='')
print('->',end='')
print(linked.next.next.val,end='')
print('->',end='')
print(linked.next.next.next.val,end='')
print('->',end='')
print(linked.next.next.next.next.val,end='')
print('->',end='')
print(linked.next.next.next.next.next)
从上面的代码可以看到,做了很多重复的工作,代码冗余。我们可以考虑用循环完成这项工作。
三、用for循环一次性添加多个节点,生成链表
# 创建头节点
head = ListNode(1)
# 创建一个不断往前移动的节点,它的起点是头节点
node = head
for x in range(2,6):
# 把node的下一个节点设为ListNode(x)
node.next = ListNode(x)
# 让node指向node的下一个节点,这样就能不停往前走
node = node.next
# 这次把打印的代码也优化一下,也用循环实现
node = head
while True:
print(node.val,end='')
print('->',end='')
node = node.next
if node is None:
print(node)
break
有两个要点在下面说明:
Q1:for循环里发生了什么?
A1: 第一次循环:node变成了头节点的下一个节点
第二次循环:node变成了头节点的下一个节点的下一个节点
第三次循环:node变成了头节点的下一个节点的下一个节点的下一个节点
……
上面的过程是不是似曾相识?就是我们在“一个一个地添加节点”中的linked.next = ListNode(2),linked.next.next=ListNode(3),linked.next.next.next=ListNode(4)……
Q2: 为什么要创建指向同一个节点ListNode(1)的两个变量head和node?
A2:单向链表的头节点是非常重要的,我们是顺着头结点找到后面所有节点,从而了解链表的全貌的。如果只用一个变量指向头节点,那么随着这个变量一步步往后走,最终我们只得到了链表的最后一个节点,前面的节点都被扔掉了(没有变量指向它们了,无法再找到它们)
而我们用head和node共同指向头节点,node往后走,创造出后面的节点,但是head始终指向头节点,这样最终我们就可以顺着head,找到后面一串的节点。