203.移除链表元素
leetcode链接
代码随想录链接
一刷状态:解出
思路
重要知识点:使用dummyHead。删除的操作一般查询下一个节点的值,如果等于target,则将next指针指向下下个节点,达到删除的效果。对于第一个节点,使用dummyHead作为其上一个节点,就可以将所有情况都统一代码处理。
代码逻辑:
- 如果下一个节点的值为target,将next指针指向下下个节点;
- 否则,滑动指针,遍历链表。
/**
* 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* dummyHead = new ListNode(0);
dummyHead->next = head;
ListNode* cur = dummyHead;
while(cur!=nullptr&&cur->next!=nullptr)
{
if(cur->next->val == val)
{
cur->next = cur->next->next;
}
else
{
cur = cur->next;
}
}
return dummyHead->next;
}
};
707.设计链表
leetcode链接
代码随想录链接
一刷状态:通过率低
思路
- addAtHead
使用dummyHead,将新添加的节点连接在dummyHead的后面 - addAtTail
遍历至链表的尾部,即cur->next为空,把新节点连接在后部 - addAtIndex
这个操作是插入到链表中下标为 index 的节点之前,同时,如果index等于链表的长度,则是插入在链表的尾部,因此由_size+1个位置可以插入。如果使用dummyHead,那就相当于插入到节点的后部,因为原链表的长度加上dummyHead就是_size+1个。遍历到index的上一个位置,修改next指针,添加节点。 - deleteAtIndex
遍历到index的上一个位置,修改next指针,删除节点。 - get
遍历到index的上一个位置,返回cur->next->val
class MyLinkedList {
public:
struct LinkedNode{
int val;
LinkedNode* next;
LinkedNode(int val):val(val), next(nullptr){};
};
MyLinkedList() {
_dummyNode = new LinkedNode(0);
_size = 0;
}
int get(int index) {
if(index>(_size-1)||index<0) return -1;
LinkedNode* cur = _dummyNode->next;
while(index)
{
index--;
cur = cur->next;
}
return cur->val;
}
void addAtHead(int val) {
LinkedNode* newHead = new LinkedNode(val);
newHead->next = _dummyNode->next;
_dummyNode->next = newHead;
_size ++;
}
void addAtTail(int val) {
LinkedNode* newHead = new LinkedNode(val);
LinkedNode* cur = _dummyNode;
while(cur->next!=nullptr)
{
cur = cur->next;
}
cur->next = newHead;
_size++;
}
void addAtIndex(int index, int val) {
if(index>_size||index<0) return;
LinkedNode* cur = _dummyNode;
LinkedNode* newHead = new LinkedNode(val);
while(index)
{
index--;
cur = cur->next;
}
newHead->next = cur->next;
cur->next = newHead;
_size++;
}
void deleteAtIndex(int index) {
if(index>(_size-1)||index<0) return;
LinkedNode* cur = _dummyNode;
while(index)
{
index--;
cur = cur->next;
}
LinkedNode* temp = cur->next;
cur->next = cur->next->next;
delete temp;
temp = nullptr;
_size--;
}
private:
LinkedNode* _dummyNode;
int _size;
};
/**
* Your MyLinkedList object will be instantiated and called as such:
* MyLinkedList* obj = new MyLinkedList();
* int param_1 = obj->get(index);
* obj->addAtHead(val);
* obj->addAtTail(val);
* obj->addAtIndex(index,val);
* obj->deleteAtIndex(index);
*/
206.反转链表
leetcode链接
代码随想录链接
一刷状态:通过
思路
- 保存下一个节点的指针,ListNode* temp = cur->next;
- 将目前遍历到的节点的下一个指针改为前一个节点,实现翻转,cur->next = pre;
- 将目前这个节点设置为上一个节点,pre = cur;
- 遍历下一个节点,cur = temp;
/**
* 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) {
ListNode* cur = head;
ListNode* pre = nullptr;
while(cur!=nullptr)
{
ListNode* temp = cur->next;
cur->next = pre;
pre = cur;
cur = temp;
}
return pre;
}
};