整個問題的解題思路如下:
- 建立指針p,用於遍歷鏈表;
- 建立指針q,q遍歷p後面的結點,並與p數值比較;
- 如果q與p值相等,則刪除q。如果q有後繼節點,則將q前驅節點和q後繼節點鏈接起來;否則直接開始下一輪遍歷。
Java代碼實現如下,建議將這段代碼copy到之前的Java版本的LinkedList(FOLinkedList)中。
/**
* @TODO 重複節點的刪除
* @param foll 需要刪除重複節點的單鏈表
* @return foll 刪除重複節點後的單鏈表
*/
public static FOLinkedList removeRepeatElement(FOLinkedList foll){
FOLinkedNode p = foll.header;
if(foll.header==null){
return foll;
}
while(p.next!=null){
FOLinkedNode q = p.next;
while(q.next!=null){
if(q.next.getE().equals(p.getE())){
q.addNext(q.next.next);
foll.size--;
}else{
q = q.next;
}
}
p=p.next;
}
return foll;
}
算法的時間性能爲O(n的2次方)