链表-链表中删除重复的结点

题目描述

在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5

分析:

题目分两个问题,一是元素值比较,找出值相同的元素;二是操作链表将后向值相同的元素删;

思路:

首先会想到最简单的(时间复杂高)使用双层循环对链表中进行遍历,找到值相同的元素,并向后面元素删除(题目没有提到需要释放内存,考虑释放比较全面,但对答题不考虑没影响~-~)

另思路:参考牛客网

首先添加一个头结点,以防碰到第一、第二结点相同情况;

设置pre,last两个指针,pre指向当前确定不重复的结点,last相当于工作指针,指向下一个结点,来遍历整个链表;

关键实现代码

class Solution {
public:
	ListNode deleteDuplication(ListNode pHead){
		if(pHead == NULL || pHead.next == NULL) 
			{return pHead;}
		ListNode Head = new ListNode(0); 
		Head.next = pHead;
		ListNode pre = Head;
		ListNode last = Head;
//		 当前工作结点不为NULL 
		while(last != NULL){
			if(last.next != NULL && last.val == last.next.val){
				//找到最后一个相同结点
				while(last.next != NULL && last.val == last.next.val){
					last = last.next;
				} 
				pre.next = last.next;
				last = last.next;
			}else{
				pre = pre.next;
				last = last.next;
			}
		} 
		return Head.next;	
	}
	
};

主要比较两个相邻结点的元素值,具体比较last->val与last->next->val,当两者相等时,更新当前确定不重复指针pre的指向,即更新pre的位置;对于1,2,2,3,3,4,4,5,6,6,7这样链表可以去掉重复的结点,但对于1,2,2,3,2,3,4,3,5,3,4,5,6;这样的无序的链表呢? 先对链表做排序,然后在比较连个相邻结点的值;

实现代码erro

/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) :
        val(x), next(NULL) {
    }
};
*/
class Solution {
public:
    ListNode* deleteDuplication(ListNode* pHead)
    {
    	//遍历链表中元素
    	ListNode* temp = pHead;
    	ListNode* p = pHead;
		while(p){
			while(temp){
				//			temp = temp->next;
				if(p->val != temp->next->val){
					temp = temp->next;
				}
				else{
					free(temp->next);
					temp->next = temp->next->next;
				}
			}
//			temp = p->next;
			p = p->next;
			temp =p->next; 
		} 
		//找到重复结点并删除 
		return pHead;
    }
};

原因?

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值