leetcode200题之链表(二)

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 节点

  1. 特例处理: 当应删除头节点 head 时,直接返回 head.next 即可。
  2. 初始化: 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;    
    }
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值