链表
数组的内存空间是连续的,链表是不连续的
链表分为单端链表和双端链表
访问O(N)
搜索O(N)
插入O(1)
删除O(1)
写很快但是读很慢
常用操作:
1.创建链表
2.添加元素
3.访问元素
4.查找元素
5.删除元素
6.链表的长度
203
给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == 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
输出:[]
提示:
列表中的节点数目在范围 [0, 104] 内
1 <= Node.val <= 50
0 <= val <= 50
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNode(int x) : val(x), next(nullptr) {} * ListNode(int x, ListNode *next) : val(x), next(next) {} * }; */ class Solution { public: ListNode* removeElements(ListNode* head, int val) { ListNode* ret_head = head; ListNode* ptr = head; if (head == nullptr) { return nullptr; } while (ptr->val == val) { ListNode* free_node = ret_head; ptr = ret_head->next; ret_head = ret_head->next; delete free_node; if (ret_head == nullptr) { return nullptr; } } while (ptr->next) { if (ptr->next->val == val) { ptr->next = ptr->next->next; } else { ptr = ptr->next; } } return ret_head; } };
206
给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。
示例 1:
输入:head = [1,2,3,4,5]
输出:[5,4,3,2,1]
示例 2:
输入:head = [1,2]
输出:[2,1]
示例 3:
输入:head = []
输出:[]
提示:
链表中节点的数目范围是 [0, 5000]
-5000 <= Node.val <= 5000
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNode(int x) : val(x), next(nullptr) {} * ListNode(int x, ListNode *next) : val(x), next(next) {} * }; */ class Solution { public: ListNode* reverseList(ListNode* head) { if (head == nullptr) { return nullptr; } vector<int> val_vec; ListNode* tmp = head; while (tmp != nullptr) { val_vec.push_back(tmp->val); tmp = tmp->next; } tmp = head; while (tmp != nullptr) { tmp->val = val_vec[val_vec.size() - 1]; tmp = tmp->next; val_vec.pop_back(); } return head; } };
无情的摸鱼机器