1. 203-移除链表元素
题意:删除链表中等于给定值 val 的所有节点。
示例 1: 输入:head = [1,2,6,3,4,5,6], val = 6 输出:[1,2,3,4,5]
示例 2: 输入:head = [], val = 1 输出:[]
示例 3: 输入:head = [7,7,7,7], val = 7 输出:[]
一般思路
分头结点和非头结点两种情况。
-
非头:设置curr = head, curr->next = curr->next->next
-
头:将head向后移动一位
虚拟头结点法
设置一个dummy_head, 简化删除过程。因为不必区分2种情况,全部都变成非头结点,所有操作(包括增删改等)都可统一进行。return dummy_head -> next
2. 707-设计链表
获取第index个结点的数值
头部插入节点
尾部插入节点
第index个结点前插入结点
删第index个结点
注意:index是从0开始的
-
时间复杂度: 涉及
index
的相关操作为 O(index), 其余为 O(1) -
空间复杂度: O(n)
class MyLinkedList: #单链表 def __init__(self): self.dummy_head = ListNode() self.size = 0 def get(self, index: int) -> int: #先进行合法判断 if index < 0 or index > self.size-1: return -1 #设置指针cur cur = self.dummy_head.next #遍历到index for i in range(index): cur = cur.next return cur.val def addAtHead(self, val: int) -> None: self.dummy_head.next = ListNode(val, self.dummy_head.next) #记得修改size! self.size += 1 def addAtTail(self, val: int) -> None: #cur = self.dummy_head.next 错 cur = self.dummy_head while cur.next: cur = cur.next cur.next = ListNode(val) self.size += 1 def addAtIndex(self, index: int, val: int) -> None: #先合法判断 #if index < 0 or index > self.size-1: 错 if index < 0 or index > self.size: return #cur = self.dummy_head.next cur = self.dummy_head #for i in range(index-1):不能是-1 因为当index=0时报错 for i in range(index): cur = cur.next cur.next = ListNode(val, cur.next) self.size += 1 def deleteAtIndex(self, index: int) -> None: if index < 0 or index > self.size-1: return #cur = self.dummy_head.next #for i in range(index-1): # cur = cur.next #cur.next = cur.next.next current = self.dummy_head for i in range(index): current = current.next current.next = current.next.next self.size -= 1 # Your MyLinkedList object will be instantiated and called as such: # obj = MyLinkedList() # param_1 = obj.get(index) # obj.addAtHead(val) # obj.addAtTail(val) # obj.addAtIndex(index,val) # obj.deleteAtIndex(index)
3. 206-翻转链表
双指针法
-
时间复杂度: O(n)
-
空间复杂度: O(1)
# Definition for singly-linked list. # class ListNode: # def __init__(self, val=0, next=None): # self.val = val # self.next = next class Solution: def reverseList(self, head: Optional[ListNode]) -> Optional[ListNode]: #双指针法 cur = head pre = None while cur: #遍历到cur不为空 temp = cur.next #先存储下来cur.next cur.next = pre #翻转方向 pre = cur #更新指针 cur = temp return pre
递归法参照双指针法写
-
时间复杂度: O(n), 要递归处理链表的每个节点
-
空间复杂度: O(n), 递归调用了 n 层栈空间