leetcode:单链表之Remove Duplicates from Sorted List II

leetcode:单链表之Remove Duplicates from Sorted List II

题目:

Given a sorted linked list, delete all nodes that have duplicate numbers, leaving only distinct numbers
from the original list.
For example,
Given 1->2->3->3->4->4->5, return 1->2->5.
Given 1->1->1->2->3, return 2->3.

即:给定一个链表,对链表删除重复的数据。

c++实现:

#include <iostream>

using namespace std;
struct ListNode
{
	int val;
	ListNode *next;
	ListNode (int x):val(x),next(NULL){ }
};
ListNode *createListNode(int arr[],int n)
{
	ListNode *r;
	ListNode *p;
	ListNode * L=(ListNode*)malloc(sizeof(ListNode));
	
	r=L;
	
	for(int i=0;i<n;i++)
	{
		p=(ListNode*)malloc(sizeof(ListNode));
		p->val=arr[i];
		r->next=p;
		r=p;
	}
	r->next=NULL;

    return L->next;
}
//递归版
//ListNode *deleteDuplicates(ListNode *head) 
//{
//
//    if(!head||!head->next)
//		return head;  
//    ListNode *p=head->next;  
//    if(head->val==p->val)  
//    {  
//       while(head->val==p->val)  
//       {  
//           p=p->next;  
//           if(!p)break;  
//       }  
//       return deleteDuplicates(p);  
//     }  
//     head->next=deleteDuplicates(head->next);  
//     return head;  
//}
//迭代版
ListNode *deleteDuplicates(ListNode *head) 
{
     if (head == NULL || head->next == NULL) 
		 return head;  
//     ListNode* dummy_head = new ListNode(-1);//注意:使用new ListNode(-1)创建头结点时,return时为dummy_head->next而不是dummy_head.next.
	 ListNode dummy_head(-1); 
     ListNode* tail = &dummy_head;  
     ListNode* node1 = head;  
     ListNode* node2 = head->next;  
     while (node1 != NULL && node2 != NULL )
	 {  
        if (node1->val != node2->val)
		{  
            tail->next = node1;  
            tail = tail->next;  
            node1 = node2;  
            node2 = node2->next;  
        } 
		else 
		{  
           while(node1!= NULL && node1->val == node2->val)   
               node1 = node1->next;  
            
           if (node1 != NULL)  
               node2 = node1->next;     
         }  
     }  
     if (node1!= NULL && tail->val != node1->val) 
	 {  
        tail->next = node1;  
        tail = tail->next;  
     }  
     tail->next = NULL;  
     return dummy_head.next; 
}
int main()
{
	int a[]={1,1,1,2,3};

	ListNode *input;
	ListNode *out;

	input= createListNode(a,5);
	out=deleteDuplicates(input);
	while(out != NULL)
	{
        cout<<out->val;
        out = out->next;
    }
	cout<<endl;
	return 0;
}
输出结果:



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值