前言
这是小老弟学习 leetcode 链表题的笔记,希望对大家有所帮助,如果喜欢,点个赞再走吧😊
leetcode 203 移除链表元素
题目链接
传送门:https://leetcode-cn.com/problems/remove-linked-list-elements/
我的题解
题目描述
给你一个以 head 开头的链表和值为 val 的整数,请你删除链表中所有满足 Node.val == val 的节点,并返回新节点。
样例
算法
(遍历) O ( n ) O(n) O(n)
由于题目可能变动头结点,故申请一个虚拟节点 dummy_node
,然后删除所有值为 val
的节点即可。记得删除之后要释放内存以及释放自己申请的内存。
/**
* 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* dummy_head = new ListNode(-1);
dummy_head->next = head;
ListNode* cur = dummy_head;
while (cur->next) {
if (cur->next->val == val) {
ListNode* tmp = cur->next;
cur->next = cur->next->next;
delete tmp;
}
else cur = cur->next;
}
head = dummy_head->next;
delete dummy_head;
return head;
}
};
leetcode 707 设计链表
题目链接
传送门:https://leetcode-cn.com/problems/design-linked-list/
我的题解
题目描述
题目要求设计出一个链表,可以是单链表,也可以是双链表,这里我选择设计单链表。要求实现以下功能:
- get(index):获取第 index 个节点的值,如果索引无效,返回 -1.
- addAtHead(val):将值为 val 的节点插入到链表头。
- addAtTail(val):将值为 val 的节点插入到链表尾。
- addAtIndex(index, val):将值为 val 的值插入到链表中第 index 个节点的位置,如果 index < 0 ,则插入头部,如果 index == size ,插入到尾部,如果 index > size ,无效插入。
- deleteAtIndex(Index):删除链表中第 index 个节点。
样例
MyLinkedList linkedList = new MyLinkedList();
linkedList.addAtHead(1);
linkedList.addAtTail(3);
linkedList.addAtIndex(1,2); //链表变为1-> 2-> 3
linkedList.get(1); //返回2
linkedList.deleteAtIndex(1); //现在链表是1-> 3
linkedList.get(1); //返回3
算法
具体见代码:
class MyLinkedList {
public:
struct MyLinkedNode {
int m_val;
MyLinkedNode* m_next;
MyLinkedNode(int val) : m_val(val), m_next(nullptr) {
}
};
/* initialize the linked list */
MyLinkedList() {
m_size = 0;
m_dummy_head = new MyLinkedNode(-1);
}
/* get the value of node at the index */
int get(int index) {
if (index < 0 || index > m_size - 1) return -1;
MyLinkedNode* cur = m_dummy_head->m_next;
for (int i = 0; i < index; ++i)
cur = cur->m_next;
return cur->m_val;
}
/* add node to the head */
void addAtHead(int val) {
MyLinkedNode* new_head_node = new MyLinkedNode(val);
new_head_node->m_next = m_dummy_head->m_next;
m_dummy_head->m_next = new_head_node;
++m_size;