1.删除链表的节点
题目: https://leetcode-cn.com/problems/shan-chu-lian-biao-de-jie-dian-lcof/
定位节点: 遍历链表,直到 head.val == val 时跳出,即可定位目标节点。
修改引用: 设节点 cur 的前驱节点为 pre ,后继节点为 cur.next ;则执行 pre.next = cur.next ,即可实现删除 cur 节点
- 特例处理: 当应删除头节点
head
时,直接返回head.next
即可。 - 初始化:
pre = head
,cur = head.next
。
class Solution {
public:
ListNode* deleteNode(ListNode* head, int val) {
if(head->val==val) return head->next;
ListNode* pre=head;
ListNode* cur=head->next;
while(cur->val!=val && cur!=nullptr){
pre=cur;
cur=cur->next;
}
if(cur!=nullptr) pre->next=cur->next;
return head;
}
};
2. 删除链表的倒数第N个节点
题目:https://leetcode-cn.com/problems/remove-nth-node-from-end-of-list/
双指针: 整体思路是让前面的指针先移动n
步,之后前后指针共同移动直到前面的指针到尾部为止。
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode *newnode = new ListNode(0);
newnode->next = head;
ListNode *pre = newnode, *p = head;
while (n--) p = p->next;
while (p) {
p = p->next;
pre = pre->next;
}
pre->next = pre->next->next;
return newnode->next;
}
};
3. 删除链表中重复元素
题目:https://leetcode-cn.com/problems/remove-duplicates-from-sorted-list/
class Solution {
public:
ListNode* deleteDuplicates(ListNode* head) {
ListNode* cur=head;
while(cur!=nullptr && cur->next!=nullptr){
if(cur->val==cur->next->val){
cur->next=cur->next->next;
}
else{
cur=cur->next;
}
}
return head;
}
};
4. 删除链表重复元素Ⅱ
题目:https://leetcode-cn.com/problems/remove-duplicates-from-sorted-list-ii/
双指针:定义pre,cur两个指针。考虑到一些边界条件,比如1->1->1->2这种情况,需要把开头的几个1给去掉,我们增加一个哑结点,方便边界处理。
初始的两个指针如下:
将pre指针指向哑结点,将cur指针指向head(哑结点的下一个节点)
如果pre指向的值不等于cur指向的值,则两个指针都前进一位
否则,就单独移动cur,cur不断往前走,直到pre指向的值不等于cur指向的值。
注意,这里不是直接比较pre.val==cur.val,这么比较不对,因为初始的时候,pre指向的是哑结点,所以比较逻辑应该是这样:pre->next->val==cur->next->val
class Solution {
public:
ListNode* deleteDuplicates(ListNode* head) {
ListNode* dummy = new ListNode(0);
dummy->next=head;
ListNode* pre=dummy;
ListNode* cur=head;
while(cur!=nullptr && cur->next!=nullptr){
if(pre->next->val!=cur->next->val){
pre=cur;
cur=cur->next;
}
else{
while(cur!=nullptr && cur->next!=nullptr && cur->val==cur->next->val){
cur=cur->next;
}
pre->next=cur->next;
cur=cur->next;
}
}
return dummy->next;
}
};
5.移除链表元素
题目:https://leetcode-cn.com/problems/remove-linked-list-elements/
思路:双指针
class Solution {
public:
ListNode* removeElements(ListNode* head, int val) {
ListNode* dummy = new ListNode(0);
dummy->next=head;
ListNode* pre=dummy;
ListNode* cur=head;
while(cur!=nullptr){
if(cur->val==val){
pre->next=cur->next;
}
else{
pre=cur;
}
cur=cur->next;
}
return dummy->next;
}
};