理论
在本地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
Comments NOTHING