Leetcode 237/83/203 两个指针与链表节点删除

问题1:

237.Delete Node in a Linked List(删除链表中某个节点)

思想:用此节点的下一个节点值覆盖要删除的那个节点值,然后删除下一个节点(地址)。

方法:两个指针法。

注意点:内容传递,地址删除

C++代码:

class Solution {
public:
    void deleteNode(ListNode* node) {
    auto next=node->next;
    *node=*next;//内容传递
    delete next;//删除地址
}
};

问题2:

83.Remove Duplicates from Sorted List(删除顺序链表中重复节点)

思想:比较前后节点的值,分类讨论。若前后相等,将后一个节点用下一个节点覆盖。若前后不相等,两个指针都往后走,但之前需要对前一个节点的下一个 

方法:两个指针法。

注意点:注意地址为NULL的情况,指针向后移,需要考虑下一个地址是什么?

C++代码:

class Solution {
public:
    ListNode* deleteDuplicates(ListNode* head) {
        if (head==NULL||head->next==NULL)
            return head;
        ListNode *p_current=head;
        ListNode *p_next=head->next;
        while(p_next)
        {
            if(p_current->val==p_next->val)
            {
                p_next=p_next->next;
            }
            else
            {
                p_current->next=p_next;//对下一个地址赋值
                p_current=p_current->next;//前后指针向后走
                p_next=p_next->next;
            }
        }
        p_current->next=NULL;
        return head;//返回删除后的链表
    }
};


问题1:

203.Remove Linked List Elements(删除链表中指定节点)

思想:判断指针的值是否和指定的值相等。若不相等,指针后移,若相等删除:地址覆盖+删除中间变量+指针重新赋值

方法:两个指针法+中间变量指针。

注意点:不能只对cur删除,要使用中间变量,返回的不是head

C++代码:

 */
class Solution {
public:
    ListNode* removeElements(ListNode* head, int val) {
        if(head == NULL)
        {
            return NULL;
        }//if
        ListNode *dummy = new ListNode(0);
        dummy->next = head;
        ListNode* pre = dummy;
        ListNode* cur = head;
        ListNode* tmp;
        while (cur)
        {
            if (cur->val==val)
            {
                tmp=cur;//中间变量tmp
                pre->next=cur->next;//覆盖当前位置的地址
                delete tmp;//删除当前地址指针
                cur=pre->next;//重新赋值变量
            }
            else
            {
                pre = pre->next;
                cur = cur->next; 
                
            }
        }
        return dummy->next;//返回删除后的链表
    }
};

总结:对C++语句理解的不够深入。

listnode应该是链表中的结点;
listnode *就是指向链表结点的指针类型;
listnode *p;也就是定义了一个指向链表结点的指针变量P

链表和指针:前后指针的指向的节点,前后指针指向节点的内容,当前指针指向的节点。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值