链表

wang 发布于 2023-11-05 18 次阅读


理论

在本地pychanm中ListNode类是未定义的,而在leetcode 中 是已经定义好的.

基本代码理解

class ListNode():
    def __init__(self,val=0,next=None): #初始化 值与 下一个  默认为 0,None
        self.val = val #属性 = 变量
        self.next = next#属性 = 变量
# 使用方便:
head = ListNode(1)                    # next自动为None
second = ListNode(2, head)            # 明确指定next
empty_node = ListNode()               # val=0, next=None      


在链表操作中判断 next 的用途:
current = head
while current.next:   # 判断下一个节点是否为空# 如果current.next不是None,说明还有后续节点
    current = current.next# 当current.next为None时,说明到达链表尾部
class ListNode():
    def __init__(self,val=0,next=None):
        self.val = val
        self.next = next

node3 = ListNode(3)
node5 = ListNode(5)
node6 = ListNode(6)
node1 = ListNode(1)

# 构建链表
node3.next = node5
node5.next = node6
node6.next = node1

# 链表构建完成,现在 node3 是链表的头节点
head = node3

# 打印链表以验证
current_node = head
while current_node:
    print(current_node.val, end='->')
    current_node = current_node.next
print('None')
#
# current = head
# while current.next:
#     print(current.val)
#     # 判断下一个节点是否为空# 如果current.next不是None,说明还有后续节点
#     current = current.next
#     # 当current.next为None时,说明到达链表尾部

链表的创建

正序创建

node1 = ListNode(5)
node2 = ListNode(6)
node3 = ListNode(7)
node4 = ListNode(8)
node1.next = node2
node2.next = node3
node3.next = node4
node4.next = None
head = node1

current = node1
while current:
    print(current.val)
    current = current.next

必须倒序创建(因为代码是从上到下创建的)

class ListNode():
    def __init__(self,val=0,next=None):
        self.val = val
        self.next = next

#错误的创建链表
# node1 = ListNode(1)
# node2 = ListNode(2,node3)
# node3 = ListNode(3,node4)
# node4 =ListNode(4,node1)

#正确的创建链表
node4 = ListNode(4)
node3 = ListNode(3, node4)
node2 = ListNode(2, node3)
node1 = ListNode(1, node2)

遍历输出

current= node1
#从node1 开始创建
while current: #判断currend为不为空
    print(current.val)
    current= current.next
   #输出 1 2 3 4

单链表

双链表

循环链表

链表的存储方式

链表的操作

添加节点

Leetcode 203 移除链表元素

class Solution:
    def removeElements(self, head: Optional[ListNode], val: int) -> Optional[ListNode]:
        # 创建虚拟头部节点 指向原链表头
        dummy_head = ListNode(next=head)

        current = dummy_head #当前节点为头节点
        while current.next:    #一直循环遍历下一个 
            if current.next.val == val: #如果 下一个节点的下一个值的val 等于 题目中的val
                current.next = current.next.next   #那么节点指向下下一个节点
            else:
                current = current.next              #否则 节点为下一个节点

        return dummy_head.next                  #返回新链表的头节点 203题

编辑器复现

复现
#创建链表
class ListNode():
    def __init__(self,val=0,next=None):
        self.val = val
        self.next = next
node4 = ListNode(4)
node3 = ListNode(3, node4)
node2 = ListNode(2, node3)
node1 = ListNode(1, node2)
val = 3 #要删除的值为3
current = dummy_head = ListNode(next = node1) #创建临时节点 和指向临时节点的next如: 临时(dummy_head) <-(current)
while current.next:
    if current.next.val == val:
        current.next = current.next.next
    else:
        current = current.next
current = dummy_head.next
while current:
    print(current.val)
    current= current.next

一名热爱海贼的AI开发者
最后更新于 2025-11-15