链表
链表是通过指针串联在一起的线性结构,每一个节点由数据域和指针域组成,最后一个节点的指针指向null
链接的入口节点称为头节点
链表的类型
单链表
上图所示
双链表
双链表的每个节点有两个指针域,一个指向上一个节点,一个指向下一个节点。
双链表可以向后查找也可以向前查找。
循环链表
循环链表即最后一个节点的指针指向头节点。
链表的存储方式
数组在内存中是连续分布的。
链表在内存中随机分布。
链表的定义
class ListNode{
def __init__(self, val, next = None)
self.val = val
self.next = next
}
链表的操作
删除节点
增加节点
性能分析
203. 移除链表元素
class Solution:
def removeElements(self, head: Optional[ListNode], val: int) -> Optional[ListNode]:
dummynode = ListNode()
dummynode.next = head
if not head:
return dummynode.next
cur = head
pre = dummynode
while cur: # 注意判断条件
if cur.val == val:
pre.next = cur.next
cur = cur.next
else:
pre = cur
cur = cur.next
return dummynode.next
206. 反转列表
class Solution:
def reverseList(self, head: Optional[ListNode]) -> Optional[ListNode]:
dummynode = ListNode()
if not head:
return head
cur = head
pre = None
while cur:
tmp = cur.next # 保存当前节点的下一个节点
cur.next = pre # 当前节点的next 指向上个节点
pre = cur # 移动上个节点
cur = tmp # 移动当前节点
if cur is None: # 如果当前节点是None
dummynode.next = pre # 指向上个非None节点
return dummynode.next
707. 设计链表
在这里插入代码片