Remove Duplicates from Sorted List II--LeetCode

来源:互联网 发布:java中文相似度匹配 编辑:程序博客网 时间:2024/06/06 20:29

题目:

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

1 0
原创粉丝点击