目录

一、链表的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:单向链表的头节点是非常重要的,我们是顺着头结点找到后面所有节点,从而了解链表的全貌的。如果只用一个变量指向头节点,那么随着这个变量一步步往后走,最终我们只得到了链表的最后一个节点,前面的节点都被扔掉了(没有变量指向它们了,无法再找到它们)

python节点编程 python节点类_单向

而我们用head和node共同指向头节点,node往后走,创造出后面的节点,但是head始终指向头节点,这样最终我们就可以顺着head,找到后面一串的节点。

python节点编程 python节点类_python节点编程_02