zoukankan      html  css  js  c++  java
  • Remove Duplicates from Sorted List II--LeetCode

    题目:

    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:看到每个题目,首先尽可能考虑全面,并且要考虑怎样使用更加简洁的思路来解决这个问题,在这个题目中,首先须要考虑刚開始就有不符合条件的节点,那么第一步须要处理的就是找到终于的头部节点,然后再解决删除节点,那么在删除的时候每次考虑两个节点。考虑这两个相邻的节点是否一样,假设一样。那么就是循环删除当前节点值的过程。假设不同,那么就须要将第一个节点插入到终于的链表中。

  • 相关阅读:
    美化单选按钮
    url的处理
    时间戳处理
    模板渲染引擎手册
    Web前端工具——Live Reload – Chrome扩展
    属性(Properties)和字段在C#中的关系
    MVC3中的Model
    使用System.Web.Mvc.Ajax
    javascript之DOM操作
    Javascript之BOM(window对象)
  • 原文地址:https://www.cnblogs.com/lcchuguo/p/5061972.html
Copyright © 2011-2022 走看看