在乙個排序的鍊錶中,存在重複的結點,請刪除該鍊錶中重複的結點,重複的結點不保留,返回煉表頭指標。 例如,鍊錶1->2->3->3->4->4->5 處理後為 1->2->5
設定三個指標,pre,curr,next。curr代表當前節點,pre代表前一節點,next代表後一節點,思路是每次如果next與curr的值相等,就將next後移直到next指向第乙個與curr值不相等的節點,直接令pre->next=next,這樣就將curr到next之間重**節點全部刪除了。重點是要特別注意刪除頭結點的情況。
初始時curr指向頭結點,next指向下一節點,如果next和curr的值不相等,就令pre=curr,curr=pre->next。如果next和curr的值相等,就將next往後移一位,一直到next的值與curr的值不相等。此時如果curr是頭結點,就重新設定頭結點為next指向的節點,curr=next;如果不是頭結點,就令pre->next=next,curr=pre->next。
特別注意:
在一切有->next操作的地方都要先確保當前節點不為空。
在判斷相等的時候,不能直接判斷節點,而是判斷value,因為next指標不同。
ac**
/*
struct listnode
};*/
class solution
if(curr==phead)
phead=pnext;
else
pre->next=pnext;
curr=pnext;
}else
}return phead;
}};
越界?特別注意在一切有->next操作的地方都要先確保當前節點不為空。修改之後還是不對,因為phead重複的情況應該放在迴圈裡面處理,不應該只單獨處理一次。會出現測試用例:
/*
struct listnode
};*/
class solution
phead=pnext;
}if(phead==null||phead->next==null)
return phead;
listnode* pre=phead;
curr=pre->next;
while(curr!=null&&curr->next!=null)
pre->next=pnext;
}else
pre=curr;
curr=pre->next;
} return phead;
}};
之前理解錯題意,以為將有重複的元素還保留下來,輸出1->2->3->4->5。**如下:要特別注意如果pnode=null,就不能再做->next的操作了,不然會越界報錯,所以while裡面除了有兩個越界檢查條件。
/*
struct listnode
};*/
class solution
pnode=pnode->next;
} return phead;
}};
上面兩個ac版本分別對應leetcode82和83
leetcode 82 ac**如下
/**
* definition for singly-linked list.
* struct listnode
* };
*/class solution
if(curr==head)
else
}else
}return head;
}};
劍指offer 鍊錶 刪除鍊錶中的重複節點
題目在乙個排序的鍊錶中,存在重複的結點,請刪除該鍊錶中重複的結點,重複的結點不保留,返回煉表頭指標。例如,鍊錶1 2 3 3 4 4 5 處理後為 1 2 5 思路分析 思路一 使用linkedlist儲存不重複節點,重構鍊錶 分析評價 這個方法是乙個比較直接且容易想到的方法,使用時只要注意一些情況...
劍指offer 刪除鍊錶中重複的結點(鍊錶)
在乙個排序的鍊錶中,存在重複的結點,請刪除該鍊錶中重複的結點,重複的結點不保留,返回煉表頭指標。例如,鍊錶1 2 3 3 4 4 5 處理後為 1 2 5 class solution listnode ans newlistnode 1 ans next phead listnode link a...
劍指Offer 鍊錶 刪除鍊錶中重複的結點
題目 在乙個排序的鍊錶中,存在重複的結點,請刪除該鍊錶中重複的結點,重複的結點不保留,返回煉表頭指標。例如,鍊錶1 2 3 3 4 4 5 處理後為 1 2 5。注意該鍊錶為排序鍊錶,重複的節點不保留哦!public class listnode 1 遞迴 遞迴的方法就像是先判斷第乙個節點和之後的節...