删除链表中重复的节点

Posted hemeiwolong

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了删除链表中重复的节点相关的知识,希望对你有一定的参考价值。

题目描述

在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
 
 
  1 #include <bits/stdc++.h>
  2 using namespace std;
  3 
  4 typedef struct node pnode;
  5 struct node
  6 {
  7     int info;
  8     pnode *next;
  9 };
 10 
 11 void create(pnode **head)   //创建链表函数
 12 {
 13     (*head) = (pnode *)malloc(sizeof(pnode));   //创建头结点
 14     (*head)->info = 0;  //记录链表节点数
 15     (*head)->next = nullptr;
 16 }
 17 
 18 void add(pnode *head, int val)  //链表添加节点函数
 19 {
 20     head->info ++;  //节点数加一
 21 
 22     while (head->next != nullptr)
 23         head = head->next;
 24 
 25     pnode *temp = (pnode *)malloc(sizeof(pnode));   //新建节点,存值
 26     temp->info = val;
 27     temp->next = nullptr;
 28     head->next = temp;
 29 }
 30 
 31 void show(pnode *head)  //打印链表
 32 {
 33     printf("[%d] ", head->info);    //先输出链表节点数
 34     head = head->next;
 35 
 36     while (head != nullptr)
 37     {
 38         printf("%d ", head->info);
 39         head = head->next;
 40     }
 41 }
 42 
 43 void solve(pnode *head) //删去重复节点
 44 {
 45     if (head == nullptr)    //参数为空指针
 46     {
 47         printf("pointer is nullptr
");
 48         return;
 49     }
 50 
 51     if (head->info == 1)    //只有一个节点
 52     {
 53         printf("list only has one node
");
 54         return;
 55     }
 56 
 57     pnode *pa, *pb, *pc;    //用三节点法删除重复节点
 58 
 59     pa = head;
 60     pb = pa->next;
 61     pc = pb->next;
 62 
 63     while (pc != nullptr)
 64     {
 65         if (pb->info == pc->info)   //发现重复节点
 66         {
 67             while (pc->info == pb->info)    //先删除重复节点序列除首节点外的节点
 68             {
 69                 pnode *temp = pc;
 70 
 71                 pc = pc->next;
 72                 pb->next = pc;
 73                 free(temp);
 74                 head->info --;
 75 
 76                 if (pc == nullptr)  //要记得判空!
 77                     break;
 78             }
 79 
 80             pnode *temp = pb;
 81 
 82             pa->next = pb = pc; //删除该重复节点序列的首节点
 83             free(temp);
 84             head->info --;
 85 
 86             if (pc != nullptr)
 87                 pc = pc->next;
 88         }
 89 
 90         else    //没发现重复节点,则三个节点同时后移一位
 91         {
 92             pa = pa->next;
 93             pb = pb->next;
 94             pc = pc->next;
 95         }
 96     }
 97 }
 98 
 99 int main()
100 {
101     pnode *head;
102 
103     create(&head);
104     add(head, 2);
105     add(head, 1);
106     add(head, 1);
107     add(head, 1);
108     add(head, 1);
109     add(head, 1);
110     show(head);
111     solve(head);
112     show(head);
113 
114     return 0;
115 }

 

 

以上是关于删除链表中重复的节点的主要内容,如果未能解决你的问题,请参考以下文章

[算法]删除链表中重复的节点

力扣——链表题 203.移除链表元素83.删除排序链表中重复元素82.删除排序链表中重复元素Ⅱ206.反转链表 876.链表的中间节点

删除未排序链表中的所有重复节点

[程序员代码面试指南]链表问题-删除无序链表中重复出现的节点

剑指Offer(链表)-删除链表中重复的节点

求删除链表中重复的节点,重复节点不保留(牛客)