剑指offer:删除重复的节点

// 删除链表的重复节点fanal.cpp : 定义控制台应用程序的入口点。
//题目描述:在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,
//          重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
//解题思路:先在草稿纸上画出几种可能的情况(头结点可能会改变的情况),分析后可知,需要三个指针
//			分别指向这次的节点,下一个节点,上一次的节点(需要将上次不重复的节点指向这一次不重复的节点上)
//          然后循环这次的节点进行判断就行了。

#include "stdafx.h"
struct ListNode {
	int val;
	struct ListNode *next;
	ListNode(int x) :
		val(x), next(NULL) {
	}
};
ListNode* deleteDuplication(ListNode* pHead)
{
	if (pHead == NULL)
		return pHead;
	ListNode* cur = pHead; //当前节点
	ListNode* pre = NULL; //上一个节点
	ListNode* next = NULL;//下次的节点
	while (cur != NULL) {
		next = cur->next;      //下一个节点的赋值
		if (next != NULL && cur->val == next->val) {        //当发现重复节点的时候
			while (next != NULL && cur->val == next->val) {   //因为可能有多个重复的节点
				next = next->next;            //一直找到下个不为这个的值
			}
			cur = next;             //将当前节点赋值为不重复的值
			if (pre != NULL)      //如果pre不为NULL,就需要将pre指向这次节点
				pre->next = cur;  //虽然可能会重复,但下次会再次进行判断
		}
		else {
			if (pre == NULL) {         //pre为NULL的时候就需要将这次不重复的节点赋值给pre
				pHead = cur;       //将head也要重新赋值,防止头指针就重复
				pre = cur;
			}
			else {
				pre->next = cur;         //pre不为null的时候,就需要将pre的next指向这次的cur,将链表链接起来
				pre = cur;				//pre为这次的节点了
			}
			cur = cur->next;     //遍历下个节点
		}

	}
	if (pre == NULL)			//如果全部都是重复的节点,pre为NULL,return null
		return NULL;
	return pHead;
}

int main()
{
	ListNode* head;

	ListNode* tmp1 = new ListNode(1);
	head = tmp1;
	ListNode* tmp2 = new ListNode(1);
	ListNode* tmp3 = new ListNode(1);
	ListNode* tmp4 = new ListNode(1);
	ListNode* tmp5 = new ListNode(1);
	ListNode* tmp6 = new ListNode(1);
	ListNode* tmp7 = new ListNode(1);
	ListNode* tmp8 = new ListNode(5);
	tmp1->next = tmp2;
	tmp2->next = tmp3;
	tmp3->next = tmp4;
	tmp4->next = tmp5;
	tmp5->next = tmp6;
	tmp6->next = tmp7;
	tmp7->next = tmp8;
	ListNode* tm = deleteDuplication(head);
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值