剑指offer:删除链表中重复的结点

本文介绍了一种算法,用于删除排序链表中的重复结点,提供了C++实现代码,并讨论了优化策略,如使用预设节点简化处理。
  1. 题目
    剑指offer:删除链表中重复的结点
    题目描述:在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。
    例如,链表1->2->3->3->4->4->5 处理后为 1->2->5

  2. 思路
    找到重复的就删除

  3. C++实现(待优化)

/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) :
        val(x), next(NULL) {
    }
};
*/
class Solution {
public:
ListNode* deleteDuplication(ListNode* pHead)
    {
        if(pHead==NULL || pHead->next==NULL) return pHead; //如果节点数目少于2个,直接返回
        ListNode *cur = pHead->next;
        if(pHead->val == cur->val){ //若首节点pHead就重复了,就寻找到下一个不重复的节点作为首节点.!!这里可以优化!!
			while(pHead->val == cur->val){
				cur = cur->next;
				if(cur==NULL) return NULL;
			}
			pHead = cur;
			cur = cur->next;
            return deleteDuplication(pHead);
		}
		ListNode *last = pHead; //记录上一个不重复的节点
		while(cur!=NULL && cur->next!=NULL){ 
			if(cur->val != cur->next->val){ 
			// 若当前节点与下一节点不重复,则last指向当前节点
				last->next = cur;
				last = cur;
				cur = cur->next;
			}
			else{
			// 若当前节点与下一节点重复了,则找到下一个不重复的节点
				int pre = cur->val;
				while(pre == cur->val){
					cur = cur->next;
					if(cur==NULL) break;
				}
			}
		}
        last->next = cur;
        return pHead;
    }

};
  1. 总结
    通过程序后,去看别人优秀的代码,发现还有不少可以优化的地方,比如,可以先自己设一个ListNode* pre,然后pre->next指向pHead即可,这样的话,就可以去掉上面说的可以优化的地方了,将其直接与下面的while合在一起处理,最后返回pre->next即可。从而使得代码更为简介与高效。
  2. 反思
    通过这次编程实现,我发现了自己对之前学过的链表知识又忘记了…本来挺简单的一道题,但由于对链表的不熟悉,还是做了蛮久的。而且,这道题也有一些细节需要注意,从而实现优化。希望自己能记住这次编程实现学到的知识,不要又忘记了。。。

题目链接
牛客网编程题——剑指offer:删除链表中重复的结点

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值