LeetCode 删除排序链表中的重复元素

题目链接 删除排序链表中的重复元素

题目描述

给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。

解题思路

就是一个链表的基本操作,目前还不太会,等学习完了再来一个链表基本操作的总结。(还有一个问题就是,不动为什么要再弄一个ptr来执行删除操作,最后在返回head,直接用head的话好像不行)
目前以弄清楚为什么用head操作不行,因为这里是一个指针,当操作完后,head指针已经移到最后面的地址上,而借用ptr操作后,head还是指向的最开始,这样就能将整个序列输出。

程序代码

c++
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* deleteDuplicates(ListNode* head) {
        if( head == NULL ) return head;
        ListNode* ptr{ head };
        while( ptr->next != NULL ){
            if( ptr->next->val == ptr->val ) {
                ListNode* p=ptr->next;
                ptr->next=p->next;
                delete p;
            }
            /*这里的操作相当于把指针ptr移动到next的next,
            然后把p指针所在的格子(或者地址)delete掉,
            昨天问了学姐,相当于把这个p打上了一个标记,
            下次再路过这里的时候,就不读取这个地址的内容,大概是这个意思
            */
            else ptr=ptr->next;
        }
        return head;
    }
};

心得

似懂非懂了链表的删除操作(目前只是记住了可以这么做),好吧,其实还不太懂这个原理,为啥把程序中的p删掉之后,就把原来的给删掉了,我再去翻翻博客找找。
(3.8日已更新当时不太会的内容)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值