《剑指offer》:[57]删除链表中重复的结点

题目:在一个排序的链表中,如何删除重复的结点?

例如,在图a中重复结点被删除之后,链表如图b所示。

方案:这个题应该说是比较简单的,不在赘述,主要利用三个指针,就可以解决这个问题。

具体实现代码:

#include <iostream>
using namespace std;
struct ListNode
{
	int data;
	ListNode *next;
};
ListNode *pHead=NULL;
ListNode *pEnd=NULL;
void CreateList()
{
	int data;
	cin>>data;
	while(0!=data)
	{
		ListNode *pNode=new ListNode;
		pNode->data=data;
		pNode->next=NULL;
		if(pHead==NULL)//空链表
		{
			pHead=pNode;
			pEnd=pNode;
		}
		else//非空链表;
		{
			// 插入在头结点;
			if(pHead->data > data )
			{
				pNode->next=pHead;
				pHead=pNode;
			}
			// 插入位置在非头结点;
			else
			{
				ListNode *p=pHead;
				while(p->next&& p->data<data)
					p=p->next;
				pNode->next=p->next;
				p->next=pNode;
			}
		}
		cin>>data;
	}
}
void DeleteDuplication(ListNode **head)//必须**,因为有可能删除头结点;
{
	if(head==NULL || *head==NULL)
		return ;
	ListNode *preNode=NULL;
	ListNode *pNode=*head;
	while(pNode!=NULL)
	{
		ListNode *pNext=pNode->next;
		bool needdelete=false;
		if(pNext!=NULL && pNext->data==pNode->data)
			needdelete=true;
		if(!needdelete)
		{
			preNode=pNode;
			pNode=pNode->next;
		}
		else
		{
			int data=pNode->data;//记录下要删除的值;
			ListNode *tobedel=pNode;
			while(tobedel!=NULL && tobedel->data==data)
			{
				pNext=tobedel->next;
				delete tobedel;
				tobedel=NULL;
				tobedel=pNext;
			}
			if(preNode==NULL)
				*head=pNext;
			else
				preNode->next=pNext;
			pNode=pNext;
		}
	}
}
void show(ListNode *head)
{
	while(head)
	{
		cout<<head->data<<" ";
		head=head->next;
	}
	cout<<endl;
}
int main()
{
	CreateList();
	DeleteDuplication(&pHead);
	show(pHead);
	system("pause");
	return 0;
}

运行结果:

时间: 2024-07-31 14:33:40

《剑指offer》:[57]删除链表中重复的结点的相关文章

[剑指offer] 56. 删除链表中重复的结点

题目描述 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5 思路: class Solution { public: ListNode *deleteDuplication(ListNode *pHead) { if (pHead == NULL || pHead->next == NULL) return pHead; List

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

题目描述: 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5 思路分析: 要考虑两种情况,链表中结点为0或1,此时直接返回原链表:第二种情况就是链表中包含两个及以上的结点. 解决第一种情况直接进行一个判断即可,第二种情况,需要定义三个指针pre, cur, nex来解决.其中为了最终返回链表头指针,需要额外定义一个指针,指向链表头.这里

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

题目描述 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5 题解: 这道题没什么讲的,注意指向空的边界就行,新建一个头节点更容易处理. 1 class Solution { 2 public: 3 ListNode* deleteDuplication(ListNode* pHead) { 4 if (pHead == nullptr

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

题目描述在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5 # Definition for singly-linked list. class ListNode: def __init__(self, x): self.val = x self.next = None class Solution: def deleteDuplicat

【剑指Offer】删除链表中重复的节点

题目:在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5 A:当遍历到第一个值为重复的节点时,要有一个指针指向它的前一个节点    因为函数原型没有传二级指针进来,且头结点也有可能被删除,所以要构建一个新结点Head 用布尔型的flag_repeat判断是否有重复节点,若有重复节点则删除,若没有重复节点则移动指针 /* struct Li

剑指offer56:删除链表中重复的结点,排序的链表中,删除重复的结点不保留,返回链表头指针。 例如,链表1-&gt;2-&gt;3-&gt;3-&gt;4-&gt;4-&gt;5 处理后为 1-&gt;2-&gt;5

1 题目描述 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5 2 思路和方法 (1)链表为空,不必多说,return NULL: (2)如果恰恰是头结点与头结点的后一个重复了,这种情况是可以发生的,那头结点就要被删除,另选新的结点作为头结点.如何处理这种特殊情况,多申请一个指针就可以了. 3 C++核心代码 1 /* 2 struct

删除链表中重复的结点-剑指Offer

删除链表中重复的结点 题目描述 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5 思路 需要两个指针,一个指向前一个节点preNode,另一个指向当前节点node,如果遇到相等的节点,node向后移动,preNode不动,存下node.val方便后面的比较,直到遇到node和node.next不相等,preNode就可以指向node.n

剑指offer-18-2. 删除链表中重复的结点

剑指offer-18-2. 删除链表中重复的结点 链表 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5 思路: 采用递归的方法查找从头节点开始重复的节点 如果没有重复节点,pHead.next指向deleteDuplication(pHead.next)返回的pHead.next本身 如果有重复节点则pHead.next指向pHead

剑指Offer:删除链表的节点【18】

剑指Offer:删除链表的节点[18] 题目描述 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5 题目分析 如上图所示,我们的定义了三个指针,其中第二.三个指针用于找到重复元素的第一个位置和最后一个位置的下一个位置,然后第一个指针的下一个指向三个指针,这样就跳过了重复元素. 但是编码发现后,还有两种情况欠考虑. 这种情况,刚开始,就是