删除链表中的重复节点

这里的删除是只要有重复就要全部删除,如1->2->2->3,删除之后就是1->3.

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

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

struct ListNode* deleteDuplicates(struct ListNode* head)
{
    if(NULL==head||NULL==head->next)
        return head;
	struct ListNode** curNext = &head;//用来指向head
    struct ListNode* cur = head;
    while(NULL!=cur)
    {
        struct ListNode* temp=cur;
        while(NULL!=cur->next && cur->next->val==cur->val)
            cur = cur->next;
        if(cur==temp)
        {
            *curNext=temp;
            curNext=&(*curNext)->next;
        }
        cur=cur->next;
    }
    *curNext = NULL;
    return head;
}

int main()
{
	int i,n,tmp;
	while(scanf("%d",&n)!=EOF)
	{
		ListNode *head=(ListNode *)malloc(sizeof(ListNode));
		ListNode *p=head;
		head->next=NULL;
		for(i=0;i<n;i++)
		{
			scanf("%d",&tmp);
			ListNode *q=(ListNode *)malloc(sizeof(ListNode));
			q->val=tmp;
			p->next=q;
			p=q;
			p->next=NULL;
		}
		ListNode *r=deleteDuplicates(head->next);
		while(r)
		{
			printf("%d ",r->val);
			r=r->next;
		}
		printf("\n");
	}
	return 0;
}
时间: 2024-08-15 14:38:34

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

[华为机试练习题]24.删除链表中的重复节点、剩余节点逆序输出

题目 描述: 题目描述: 输入一个不带头节点的单向链表(链表的节点数小于100),删除链表中内容重复的节点(重复的节点全部删除),剩余的节点逆序倒排. 要求实现函数: void vChanProcess(strNode * pstrIn,strNode * pstrOut); [输入] pstrIn:输入一个不带头节点的单向链表 [输出] pstrOut:删除内容重复的节点(重复的节点全部删除),剩余节点逆序输出(不带头节点,链表第一个节点的内存已经申请). [注意]只需要完成该函数功能算法,中

删除链表中的重复节点、剩余节点逆序输出

#include <stdlib.h> #include <algorithm> #include <functional> #include <iostream> #include "oj.h" using namespace std; /* 功能: 输入一个不带头节点的单向链表(链表的节点数小于100),删除链表中内容重复的节点(重复的节点全部删除),剩余的节点逆序倒排. 输入: pstrIn: 输入一个不带头节点的单向链表 输出:

[华为机试练习题]24.删除链表中的反复节点、剩余节点逆序输出

题目 描写叙述: 题目描写叙述: 输入一个不带头节点的单向链表(链表的节点数小于100),删除链表中内容反复的节点(反复的节点所有删除),剩余的节点逆序倒排. 要求实现函数: void vChanProcess(strNode * pstrIn,strNode * pstrOut); [输入] pstrIn:输入一个不带头节点的单向链表 [输出] pstrOut:删除内容反复的节点(反复的节点所有删除).剩余节点逆序输出(不带头节点,链表第一个节点的内存已经申请). [注意]仅仅须要完毕该函数功

如何删除链表中值重复的节点

前言 ??最近在刷<剑指offer>的题,其中有一道题目叫做删除链表中重复的节点,我想了半天没想到比较好的解决办法,于是看了看大佬的解析(菜哭了).不看不知道,一看吓一跳,这尼玛写的也太妙了,忍不住写篇博客记录一下这个解题思路和代码. 题目描述 ??在一个排好序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5. 解题思路 ??这道题我

老虎-删除排序链表中的重复节点

题目:1-1-2-3-3-3-4-5-6-6-7,删除重复节点后返回2-4-5-7 def delete_duplicate(head): h = Node(0) k = h p = head if not p or not p.next: return head q = p.next if p.val!=q.val: k.next = p k = k.next while q.next: if q.val!=p.val and q.val!=q.next.val: k.next = q k =

LintCode Python 简单级题目 112.删除链表中的重复元素

题目描述: 给定一个排序链表,删除所有重复的元素每个元素只留下一个. 您在真实的面试中是否遇到过这个题? Yes 样例 给出 1->1->2->null,返回 1->2->null 给出 1->1->2->3->3->null,返回 1->2->3->null 标签 链表 题目分析: 给定一个排序链表,删除所有重复的元素每个元素只留下一个. 源码: """ Definition of ListNod

83删除链表中的重复元素

1.思路 吸取了前几道题设置头节点重新插入的想法 建立空的头节点,和一个指向结点的指针p用来控制插入的位置 判断第一个值和第二个值是否相等相等,链表头指针向后移动,直至不等,把head结点插入到空结点后面,直至完成 2.错误 错误提示:Line 16: Char 18: runtime error: member access within null pointer of type 'struct ListNode' (solution.cpp) 错误原因:没有判断当前指针是否指向了一个有意义的

删除有序链表中的重复结点

一,问题描述 请自己构造一个简单的有序单链表,然后实现删除链表中的重复结点.比如: 二,问题分析 首先要实现一个单链表,因此需要定义一个节点类Node.其次,实现向链表中添加结点的方法(使用尾插法)addNode 删除重复结点的实现思路: 定义两个指针:pre 和 next.初始时,pre指向链表中的第一个元素,next指向链表中的第二个元素.如果 pre 的值与 next 的值不相等,则两个指针分别都向后移一个结点:若相等,则删除 next 指针指向的结点即可. 三,整个代码实现 // del

LeetCode237_Delete Node in a Linked List(删除链表中的节点) Java题解

题目: Write a function to delete a node (except the tail) in a singly linked list, given only access to that node. Supposed the linked list is 1 -> 2 -> 3 -> 4 and you are given the third node with value 3, the linked list should become 1 -> 2 -