说明:
Given a sorted linked list, delete all duplicates such that each element appear only once.
For example,
Given 1->1->2, return 1->2.
Given 1->1->2->3->3, return 1->2->3.
代码:
/*************************************************************************
> File Name: 链表.c
> Author: ZhangY
> Mail: 392255326@qq.com
> Created Time: 2016年03月21日 星期一 10时15分42秒
************************************************************************/
#include<stdio.h>
#include <stdlib.h>
typedef struct _LinkNode
{
int data;
struct _LinkNode *next;
}LinkNode;
typedef struct _LinkList
{
LinkNode *head;
int length;
}LinkList;
//初始话链表
LinkList *Init()
{
//创建链表
LinkList *list=(LinkList*)malloc(sizeof(LinkList));
//创建节点
LinkNode *node=(LinkNode*)malloc(sizeof(LinkNode));
//初始化
list->head=node;
list->length=0;
node->next=NULL;
node->data=0;
return list;
}
//插入
void Insert(LinkList* list,int pos,int data)
{
//合法性检验
if(list==NULL||pos<0)
return;
if(pos>list->length)
pos=list->length;
//创建辅助节点
LinkNode *pCurrent=list->head;
//便利找到pos的前一个位置
int i;
for(i=0;i<pos;i++)
pCurrent=pCurrent->next;
//创建新节点
LinkNode *newnode=(LinkNode*)malloc(sizeof(LinkNode));
newnode->data=data;
newnode->next=NULL;
//插入节点
newnode->next=pCurrent->next;
pCurrent->next=newnode;
list->length++;
}
//删除指定位置的节点
void Dele(LinkList *list,int pos)
{
//合法性检验
if(list==NULL)
return;
if(pos<0||pos>list->length-1)
return;
//创建辅助节点
LinkNode *pCurrent=list->head;
//遍历找到要删除节点的前一个位置
int i=0;
for(i=0;i<pos;i++)
pCurrent=pCurrent->next;
//创建节点保存节点信息
LinkNode *node=pCurrent->next->next;
//删除节点
free(pCurrent->next);
pCurrent->next=node;
list->length--;
}
//清空链表
void Free(LinkList *list)
{
if(list==NULL)
return;
//创建辅助节点
LinkNode* pCurrent=list->head->next;
//遍历清空
while(pCurrent!=NULL)
{
//创建辅助节点
LinkNode *node=pCurrent->next;
free(pCurrent);
pCurrent=node;
}
list->head->next=NULL;
}
//销毁链表
void Detroy(LinkList* list)
{
if(list==NULL)
return;
Free(list);
if(list->head!=NULL)
free(list->head);
free(list);
}
//根据指定数据删除链表节点
void DelDataNode(LinkList *list,int data)
{
//合法性检验
if(list==NULL)
return;
//创建辅助节点
LinkNode *pPrev=list->head;
LinkNode *pCurrent=pPrev->next;
//遍历找到data所在的节点
while(pCurrent!=NULL)
{
if(pCurrent->data==data)
{
pPrev->next=pCurrent->next;
free(pCurrent);
list->length--;
pCurrent=pPrev->next;
}
else
{
pPrev=pCurrent;
pCurrent=pCurrent->next;
}
}
}
//打印
void Print(LinkList *list)
{
if(list==NULL)
return;
//创建辅助节点
LinkNode *pCurrent=list->head->next;
//遍历打印
while(pCurrent!=NULL)
{
printf("%2d",pCurrent->data);
pCurrent=pCurrent->next;
}
printf("\n======\n");
}
//删除相同的数据节点,只保留一个
void DelSameData(LinkList* list)
{
if(list==NULL)
return;
//创建辅助节点
LinkNode *pPrev=list->head->next;
LinkNode *pCurrent=pPrev->next;
LinkNode *node=pPrev;
int i;
for(i=1;i<list->length;i++)
{
if(node->data==pCurrent->data)
{
node->next=pCurrent->next;
free(pCurrent);
pCurrent=node->next;
}
else{
pCurrent=pCurrent->next;
node=node->next;
}
}
}
//主函数
int main()
{
//创建链表
LinkList *list=Init();
//插入数据
Insert(list,0,6);
Insert(list,0,5);
Insert(list,0,4);
Insert(list,0,3);
Insert(list,0,3);
Insert(list,0,3);
Insert(list,0,2);
Insert(list,0,2);
Insert(list,0,1);
Insert(list,0,1);
Insert(list,0,1);
Insert(list,0,1);
//打印
Print(list);
//删除第一号位置数据
Dele(list,1);
Print(list);
//删除数据为1的节点
DelDataNode(list,1);
Print(list);
//Remove Duplicates from Sorted List
DelSameData(list);
Print(list);
//销毁链表
Detroy(list);
return 0;
}