#include<iostream>
#include<string>
#include<vector>
#include<stack>
#include<stdlib.h>
#include"algorithm"
using namespace std;
//链表结点
typedef struct _ListNode{
int data;
struct _ListNode* next;
}ListNode;
//无头节点
ListNode* LinkList_Create(int *value, int num)
{
ListNode *pHead = (ListNode*)malloc(sizeof(ListNode));
ListNode *pTail = pHead;
pHead->data = value[0];
pHead->next = NULL;
for(int i = 1; i < num; i++)
{
ListNode *pCur = (ListNode*)malloc(sizeof(ListNode));
pCur->data = value[i];
pTail-> next= pCur;
pTail = pCur;
}
pTail->next = NULL;
return pHead;
}
void PrintNode(ListNode *head)
{
ListNode *p = head;
for(;p;p = p->next)
{
printf("%d ",p->data);
}
printf("\n");
}
/****************************算法***********************************/
ListNode* DeleteDuplication(ListNode* pHead)
{
if(pHead == NULL)
{
return NULL;
}
//当前节点的前一个节点
ListNode* pPre = NULL;
//当前节点
ListNode* pCur = pHead;
//后一个节点
ListNode* pNext = NULL;
while(pCur != NULL)
{
//如果当前节点与下一个节点相同 找到重复节点
if(pCur->next != NULL && pCur->data == pCur->next->data)
{
pNext = pCur->next;
//找到最后一个重复节点 1 2 2 2 3 4
while(pNext->next != NULL && pCur->data == pNext->next->data)
{
pNext = pNext->next;
}
//如果第一个节点就开始重复 pCur指向第一个节点
if(pCur == pHead)
{
pHead = pNext->next;
}
else //pCur指向不指向第一个节点
{
pPre->next = pNext->next;
}
//向前移动
pCur = pNext->next;
}
else //如果当前节点与下一个节点不相同
{
pPre = pCur;
pCur = pCur->next;
}
}
return pHead;
}
int main()
{
int data[7] = {1,2,2,2,3,6,6};
ListNode* pHead = LinkList_Create(data,7);
PrintNode(pHead);
ListNode *list = DeleteDuplication(pHead);
PrintNode(list);
return 0;
}
6、删除链表中的重复节点
最新推荐文章于 2022-07-31 11:23:29 发布