顺序表
表a、元素的大小统一,将元素顺序存入元素存储区
表b、元素的大小不统一,实际元素另行存储,顺序表各单元位置存储相应元素的位置信息(链接)
顺序表总结
表空间扩充策略
python中的list空间扩充策略
顺序表总结
链接表
- 链接表的基本思想:
- 单链表的结构
- 链表在python中的结构
ListNode{val: 9, next: None} #单节点
ListNode{val: 0, next: ListNode{val: 1, next: ListNode{val: 2, next: ListNode{val: 3, next: ListNode{val: 4, next: ListNode{val: 5, next: ListNode{val: 6, next: ListNode{val: 7, next: ListNode{val: 8, next: ListNode{val: 9, next: None}}}}}}}}}}
作业一:
将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
- 解题思路:
- 创建一个链表,并使用2个变量(res、prev)指向同一个链表。
- 当l1和L2变量指向的首结点值不为None时,比较l1和l2当前指向节点值的大小,小的值赋给prev,并通过prev = prev.next移动prev指向新加入的值
- 若l1和l2有一个值为空的话,只需将剩余值放入结果链表即可。
- res一直指向结果链表的首结点,所以prev完成移动后,结果链表即形成
class Solution:
def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode:
res = ListNode(0)
prev = res #prev和res同时指向一个链表,prev移动进行链表操作。
while l1 is not None and l2 is not None:
if l1.val <= l2.val:
prev.next = l1
l1 = l1.next
else:
prev.next = l2
l2 = l2.next
prev = prev.next
prev.next = l1 if l1 is not None else l2
return res.next # res一直指向结果链表的首结点,所以prev完成移动后,结果链表即形成
代码执行结果:
作业二
给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
- 方法一解题思路:
- 首先获取链表长度
- 通过链表长度和n的值,使prev指向需要操作的结点的前一个结点
- 进行结点删除操作
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def removeNthFromEnd(self, head: ListNode, n: int) -> ListNode:
len = 0
prev = head
while prev is not None:
len +=1
prev = prev.next
prev = head
for i in range(1,len-n):
prev = prev.next
prev.next = prev.next.next
return head
- 代码执行结果
- 方法二解题思路
使用双指针,以n为间距进行移动,一次循环即可完成操作,避免计算链表长度。
class Solution:
def removeNthFromEnd(self, head: ListNode, n: int) -> ListNode:
# 方法二:使用2个指针,一个循环效率高
pre1,pre2 = head,head
while pre1.next is not None:
pre1 = pre1.next
n-=1
if n < 0:
pre2 = pre2.next
pre2.next = pre1
return head
作业三
给定一个链表,旋转链表,将链表每个节点向右移动k个位置,其中k是非负数。
- 解题思路
1.利用指针截断链表再拼接。
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def rotateRight(self, head: ListNode, k: int) -> ListNode:
len = 0
res,l1,l2 = head,head,head
while l1 is not None: #获取链表长度
l1 = l1.next
len+=1
if k > len: #实现循环移动
k= k%len
for i in range(1,len-k):
l2 = l2.next
res = l2.next
l2.next = None
res1 = res
for j in range(k-1):
res1 = res1.next
res1.next = head
return res