链表操作的时间复杂度
| 操作 | 时间复杂度 |
|---|---|
| 查找元素 | O(n) |
| 插入元素 | O(1) |
| 删除元素 | O(1) |
链表的解题技巧
- 多指针
- 2个,快慢指针
- 3个,链表反转
- 4个,结点交换
- 虚拟头结点
- 常用于删除结点的情况
- 其他情况也可具体分析
LeetCode 206
给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。
示例 1:
输入:head = [1,2,3,4,5]
输出:[5,4,3,2,1]
C++
class Solution {
public:
ListNode* reverseList(ListNode* head) {
ListNode *pre = nullptr;
ListNode *current = head;
while (current != nullptr) {
ListNode *next = current->next;
// 反转
current->next = pre;
// 调整指针,准备进行下一次反转
pre = current;
current = next;
}
return pre;
}
};
Swift
class Solution {
func removeElements(_ head: ListNode?, _ val: Int) -> ListNode? {
let dummyHead = ListNode()
dummyHead.next = head
var pre: ListNode? = dummyHead
var current: ListNode? = head
while current != nil {
let next = current?.next
if current?.val == val {
pre?.next = next // 移除current
} else {
pre = current
}
current = next
}
return dummyHead.next
}
}
LeetCode 203
给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。
示例 1:
输入:head = [1,2,6,3,4,5,6], val = 6
输出:[1,2,3,4,5]
C++
class Solution {
public:
ListNode* removeElements(ListNode* head, int val) {
ListNode *dummyHead = new ListNode(0);
dummyHead->next = head;
ListNode *pre = dummyHead;
ListNode *current = head;
while (current != nullptr) {
ListNode *next = current->next;
if (current->val == val) {
current->next = nullptr;
pre->next = next;
delete current;
} else {
pre = current;
}
current = next;
}
head = dummyHead->next;
delete dummyHead;
return head;
}
};
Swift
class Solution {
func removeElements(_ head: ListNode?, _ val: Int) -> ListNode? {
let dummyHead = ListNode()
dummyHead.next = head
var pre: ListNode? = dummyHead
var current: ListNode? = head
while current != nil {
let next = current?.next
if current?.val == val {
pre?.next = next // 移除current
} else {
pre = current
}
current = next
}
return dummyHead.next
}
}
更多解题代码查看GitHub
阅读原文,关注[空与一]