您好,登錄后才能下訂單哦!
本篇內(nèi)容主要講解“Java怎么刪除鏈表中重復的結點”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Java怎么刪除鏈表中重復的結點”吧!
核心考點:鏈表操作,臨界條件檢查,特殊情況處理
在一個排序的鏈表中,存在重復的結點,請刪除該鏈表中重復的結點,重復的結點不保留,返回鏈表頭指針。
解決該問題較簡單,且在寫代碼時不易出錯的做法如下:
遍歷一遍鏈表,記錄重復結點的結點值。
再遍歷一遍鏈表,逐個刪除重復結點。
該方法需要遍歷兩遍鏈表,且需要開辟額外的內(nèi)存空間存儲重復結點的結點值,所以一般不提倡。
/* struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { } };*/ class Solution { public: ListNode* deleteDuplication(ListNode* pHead) { if(pHead == nullptr||pHead->next == nullptr) //鏈表為空或只有一個結點無需進行操作 return pHead; ListNode* cur = pHead; unordered_set<int> filter; //1、遍歷鏈表找出重復的結點,將結點值存入filter while (cur->next) { if (cur->val == cur->next->val) filter.insert(cur->val); cur = cur->next; } //2、逐個刪除重復的結點 //先刪除頭部的重復結點 while(pHead&&filter.find(pHead->val) != filter.end()) { pHead = pHead->next; } if(pHead == nullptr) return nullptr; //再刪除其余的重復結點 ListNode* prev = pHead; ListNode* last = prev->next; while(last) { if(filter.find(last->val) != filter.end()) { prev->next = last->next; last = last->next; } else { prev = prev->next; last = last->next; } } return pHead; //返回鏈表頭指針 } };
我們當然應該盡可能在遍歷一遍鏈表的情況下解決該問題,這時我們需要使用兩個指針配合完成,該過程當中包含大量細節(jié),大致步驟如下:
1.為了后續(xù)操作方便,先為該鏈表創(chuàng)建一個頭結點。
2.使用指針prev和last遍歷鏈表,初始時prev指向頭結點,last指向頭結點的下一個結點。
3.當last指向的結點值與其后一個結點的結點值相同時,last獨自后移,直到last指向結點的結點值與其下一個結點的結點值不同為止,此時讓prev指向的結點指向last的后一個結點,最后讓last指向下一個結點(圖中未后移)。
4.當last指向的結點值與其后一個結點的結點值不同時,prev和last一同向后移。
如此進行下去,直到last將鏈表遍歷完,鏈表當中重復的結點也就全部被刪除了,最后返回頭結點指向的鏈表即可。
/* struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { } };*/ class Solution { public: ListNode* deleteDuplication(ListNode* pHead) { if (pHead == nullptr || pHead->next == nullptr) //鏈表為空或只有一個結點無需進行操作 return pHead; ListNode* head = new ListNode(0); //創(chuàng)建頭結點(便于操作) head->next = pHead; //頭結點與原鏈表建立關系 ListNode* prev = head; ListNode* last = prev->next; while (last) { //未發(fā)現(xiàn)重復的結點,prev和last一同后移 while (last->next&&last->val != last->next->val) { prev = prev->next; last = last->next; } //發(fā)現(xiàn)重復的結點,last獨自后移 while (last->next&&last->val == last->next->val) { last = last->next; } //到達此處有三種情況: //1、沒有需要刪除的重復結點,是因為last->next == nullptr到此 //2、有需要刪除的重復結點,是因為last->next == nullptr到此(鏈表后半段都需要刪除) //3、有需要刪除的重復結點,是因為last->val != last->next->val到此(鏈表中間某段需要刪除) if (prev->next != last) //說明有需要刪除的重復結點 { prev->next = last->next; } last = last->next; } return head->next; //返回鏈表頭指針 } };
到此,相信大家對“Java怎么刪除鏈表中重復的結點”有了更深的了解,不妨來實際操作一番吧!這里是億速云網(wǎng)站,更多相關內(nèi)容可以進入相關頻道進行查詢,關注我們,繼續(xù)學習!
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。