代码随想录算法训练营 Day3
- 知识点:
- 链表理论基础
- 链表基本操作
203.移除链表元素
- 思路:遍历指针找对应元素位置
- 答案:
/**
* 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 = new ListNode(0);
dummy -> next = head;
ListNode *cur = dummy;
while(cur -> next != NULL) {
if (cur -> next -> val == val) {
ListNode *tmp = cur -> next;
cur -> next = cur -> next -> next;
delete tmp;
} else {
cur = cur -> next;
}
}
head = dummy->next;
delete dummy;
return head;
}
};
707.设计链表
- 思路:模拟链表操作,注意循环结束条件,下标
!!!:链表索引[0, n-1] - 答案:
class MyLinkedList {
public:
struct LinkNode {
int val;
LinkNode *next;
LinkNode(int x): val(x), next(nullptr) {}
};
// 初始化链表
MyLinkedList () {
_dummy = new LinkNode(0);
_size = 0;
}
// 获取链表中下标为index的节点
int get(int index) {
if (index > ( _size - 1) || index < 0)
return -1;
LinkNode *cur = _dummy->next; // 链表指向头节点head
while (index--) {
cur = cur->next;
}
return cur->val;
}
// 将一个值为 val 的节点插入到链表中第一个元素之前
void addAtHead(int val) {
LinkNode *node = new LinkNode(val);
node->next = _dummy->next;
_dummy->next = node;
_size++;
}
// 将一个值为 val 的节点追加到链表中作为链表的最后一个元素
// 注意情况["MyLinkedList","addAtTail","get"]
void addAtTail(int val) {
LinkNode *node = new LinkNode(val);
LinkNode *cur = _dummy;
while (cur->next != nullptr)
cur = cur->next;
cur->next = node;
_size++;
}
// 将一个值为 val 的节点插入到链表中下标为 index 的节点之前
// 1. 如果 index 等于链表的长度,那么该节点会被追加到链表的末尾
// 2. 如果 index 比长度更大,该节点将 不会插入 到链表中
void addAtIndex(int index, int val) {
if (index > _size) return;
if (index < 0) index = 0;
LinkNode *node = new LinkNode(val);
LinkNode *cur = _dummy;
while (index--)
cur = cur->next;
node->next = cur->next;
cur->next = node;
_size++;
}
// 如果下标有效,则删除链表中下标为 index 的节点
void deleteAtIndex(int index) {
if (index >= _size || index < 0)
return;
LinkNode *cur = _dummy;
while (index--)
cur = cur->next;
LinkNode *tmp = cur->next;
cur->next = cur->next->next;
delete tmp;
tmp = nullptr;
_size--;
}
private:
int _size;
LinkNode *_dummy;
};
206.反转链表
- 思路:
- 双指针
- 递归
- 答案:
双指针法:
class Solution {
public:
ListNode* reverseList(ListNode* head) {
// 双指针:pre指向前一个,cur指向当前节点
ListNode *pre = NULL;
ListNode *cur = head;
while (cur) {
ListNode *tmp = cur->next;
cur->next = pre;
pre = cur;
cur = tmp;
}
return pre;
}
};
[TODO]:
- 链表理论总结
- C++面向对象基础