您的位置:首页 > 其它

Remove Duplicates from Sorted List II--LeetCode

2015-03-31 16:33 239 查看

题目:

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
.

思路:先锁定头,然后处理中间位置,记得最后处理尾部,知识繁琐,处理头部时,找到一个节点,当前节点没有相同的连续节点,同时节点和后序节点不同。处理中间只需要记录前序节点和遍历节点即可,使得遍历节点没有连续相同的节点。如果有连续相同的节点,那么删除所有的连续相同的节点

#include <iostream>
#include <vector>
using namespace std;

typedef struct list_node List;
struct list_node
{
	int value;
	struct list_node* next;
};

void Init_List(List*& head,int* array,int n)  
{  
    head = NULL;  
    List* tmp;  
    List* record;  
    for(int i=1;i<=n;i++)  
    {  
        tmp = new List;  
        tmp->next = NULL;  
        tmp->value = array[i-1];  
        if(head == NULL)  
        {  
            head = tmp;  
            record = head;  
        }  
        else  
        {  
            record->next = tmp;  
            record = tmp;  
        }  
    }  
}  
void print_list(List* list)  
{  
    List* tmp=list;  
    while(tmp != NULL)  
    {  
        cout<<tmp->value<<endl;  
        tmp = tmp->next;   
    }  
}  
  
void RemoveDuplicate(List*& head)
{
	if(head == NULL || head->next==NULL)
		return ;
	 List* pre=head;
	 List* cur;
	 List* fast;
	 if(head->value == head->next->value)
	{
	 while(1)
	 {
	 	while(pre != NULL &&pre->next != NULL)
		 {
	 		if(pre->value == pre->next->value)
	 			pre = pre->next;
	 		else
	 			break;
	 	}	
	 	pre = pre->next;
	 	if(pre->next == NULL || pre->value != pre->next->value)
	 	{
	 		head = pre;
	 		break;
	 	}	 		
	 }	
	} 
	 if(head == NULL)
	 	return ;
	 pre = head;
	 cur=head->next;
	 while(cur !=NULL && cur->next != NULL)
	 {
	 	if(cur->value != cur->next->value)
	 	{
	 		if(pre->next != cur) // 不相邻 
			{
				cur = cur->next; 
				pre->next = cur;
			} 
			else
			{
				pre = cur;
				cur = cur->next;
			}	 		
	 	}
	 	else
	 	{
	 		cur = cur->next;
	 	}
	 }
	if(pre->next!=NULL && pre->next->next !=NULL)
	{
		if(pre->next->value == pre->next->next->value)
			pre->next = NULL;
	}
} 
  
int main() 
{
	int array[]={1,1,1,2,2,3,4,4,4,5,5,7,7,8};
	List* head;
	Init_List(head,array,sizeof(array)/sizeof(int));
	RemoveDuplicate(head);	
	print_list(head); 
	return 0;
}
PS:看到每一个题目,首先尽可能考虑全面,而且要考虑如何使用更加简洁的思路来解决问题,在这个题目中,首先需要考虑刚开始就有不符合条件的节点,那么第一步需要处理的就是找到最终的头部节点,然后再解决删除节点,那么在删除的时候每次考虑两个节点,考虑这两个相邻的节点是否一样,如果一样,那么就是循环删除当前节点值的过程,如果不同,那么就需要将第一个节点插入到最终的链表中。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: