remove duplicates from sorted list(移除有序連結串列中的重複元素)
阿新 • • 發佈:2019-01-09
題目描述
Given a sorted linked list, delete all duplicates such that each element appear only once.
For example,
Given1->1->2, return1->2.
Given1->1->2->3->3, return1->2->3.
題目大意
給定一個有序連結串列,刪除其中重複元素,僅剩下一個。
如例子所見。
第一種方法
思路
維護兩個指標,前指標負責向後遍歷,後指標負責連線不重複的元素。
注意delete操作,以防止記憶體洩漏。
程式碼
#include<iostream> using namespace std; // Definition for singly-linked list. struct ListNode { int val; ListNode *next; ListNode(int x) : val(x), next(NULL) {} }; typedef ListNode* list_node; // 別名 ListNode *deleteDuplicates(ListNode *head) { if(head == NULL)return NULL; list_node p1 = head; list_node p2 = head->next; while(p2) { if(p1->val == p2->val) { p1->next = NULL; list_node tmp = p2; p2 = p2->next; delete tmp; } else { p1->next = p2; p1 = p1->next; p2 = p2->next; } } return head; } int main() { list_node p1, p2, p3, p4, p5; p1 = new ListNode(1); p2 = new ListNode(1); p3 = new ListNode(2); p4 = new ListNode(3); p5 = new ListNode(3); p1->next = p2; p2->next = p3; p3->next = p4; p4->next = p5; p1 = deleteDuplicates(p1); while(p1) { cout << p1->val << ' '; p1 = p1->next; } return 0; }
執行結果
第二種方法
思路
思路跟第一種並無大的區別。
程式碼
typedef ListNode* list_node; // 別名 ListNode *deleteDuplicates(ListNode *head) { if(head == NULL)return head; list_node cur = head; while(cur != NULL) { while(cur->next != NULL && cur->val == cur->next->val) { list_node tmp = cur->next; cur->next = cur->next->next; delete tmp; } cur = cur->next; } return head; }
執行結果
以上。