删除链表中重复的数

题目:

给定一个排序的链表,将其中重复的数全部删除。

比如:1-->1-->1-->2-->3,则返回2-->3

#include <stdio.h>
#include <stdlib.h>

typedef struct ListNode
{
    ListNode* next;
    int val;
};

ListNode* rmDumplicateNums(ListNode* head)
{
   ListNode stHead = {0};
   ListNode* node = head;
   ListNode* p = &stHead;
   ListNode* next;
   ListNode* tmp;
   bool flag;

   /*此题采用尾插法即可*/
   while (node)
   {
       flag = false;
       next = node->next;
       /*找到相等的结点*/
       while (next && (node->val==next->val))
       {
            next = next->next;
            flag = true;
       }

       /*有就删除*/
       if (flag)
       {
           while (node != next)
           {
               tmp = node->next;
               free(node);
               node = tmp;
           }
       }
       /*否则插入*/
       else
       {
           p->next = node;
           p = p->next;
       }

       node = next;
   }
   p->next = NULL;

   return stHead.next;
}

void createList(ListNode* head, int* num, int n)
{
     ListNode* p;
     int i;

     for (i=0; i<n; i++)
     {
        p = (ListNode*)malloc(sizeof(ListNode));
        p->next = head->next;
        p->val = num[i];
        head->next = p;
     }
}

void printList(ListNode* head)
{
   ListNode* p = head->next;

   while (p)
   {
        printf("%d ", p->val);
        p = p->next;
   }

   printf("\n");
}

int main()
{
     ListNode stHead = {0};
     int a[] = {5, 5, 1, 1, 1};
     createList(&stHead, a, 5);
     printList(&stHead);
     stHead.next = rmDumplicateNums(stHead.next);
     printList(&stHead);
     return 0;
}
时间: 2024-08-24 19:40:55

删除链表中重复的数的相关文章

删除顺序链表中重复的数 (一) leecode

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. 1 /** 2 * Definition for singly-linked list. 3 * public class

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

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

删除链表中重复的节点

因为这个程序快累死老子了,细节处理很麻烦package Solutions; import java.util.ArrayList; /** * Created by hu on 2015/12/12. *//** 删除链表中重复的结点*在一个排序的链表中,存在重复的结点,* 请删除该链表中重复的结点,重复的结点不保留,返回链表头指针.* 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5** */public class solut

剑指offer——面试题18.1:删除链表中重复的节点

1 // 面试题18(二):删除链表中重复的结点 2 // 题目:在一个排序的链表中,如何删除重复的结点?例如,在图3.4(a)中重复 3 // 结点被删除之后,链表如图3.4(b)所示. 4 5 #include <cstdio> 6 #include "List.h" 7 8 void DeleteDuplication(ListNode** pHead) 9 { 10 if(pHead == nullptr || *pHead == nullptr) 11 retur

剑指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(链表)-删除链表中重复的节点

(删除链表中重复的节点)题目描述: 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5 解题思路:这里的重复的节点不保留是将只要重复了的节点都要删除掉,所以考虑利用哈希set的方法,先进行重复性的判断,将重复的元素加入到哈希set中去,然后将重复的元素删除. 利用到了两个指针pre和cur,来表示前一个节点和当前节点. /* public

54、删除链表中重复的结点

一.题目 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5 二.解法 1 /* 2 public class ListNode { 3 int val; 4 ListNode next = null; 5 6 ListNode(int val) { 7 this.val = val; 8 } 9 } 10 */ 11 import ja

删除链表中重复的结点

题目描述 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5 /* struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { } }; */ class Solution { public: ListNode* dele

剑指offer(四十三)之删除链表中重复的结点

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