チェーンテーブル要素の削除:歩哨ノード
4038 ワード
目次チェーンテーブル要素削除:歩哨ノード 83. ソートチェーンテーブルの重複要素Iを削除する 題名説明 コード実装 複雑度分析 203.チェーンテーブル要素の除去 題名説明 哨兵ノードの利用 コード実装 複雑度分析 82.ソートチェーンテーブルの重複要素を削除するII 題名説明 コード実装 複雑度分析
チェーンテーブル要素の削除:歩哨ノード
83.ソートチェーンテーブルの重複要素Iを削除する
タイトルの説明
ソートチェーンテーブルを指定し、重複するすべての要素を削除して、各要素が一度だけ表示されるようにします.
これは星を描く簡単な問題で、難易度はあまり高くありません.注意すべき点は次のとおりです.チェーンテーブルが順番に並んでいるので、このような場合は、次のものが前のものと等しいかどうかを見て、繰り返し要素を探しましょう. もう一つ、削除された要素は最初のノードではありません.
コード実装
複雑度分析時間複雑度:O(n)、nはノード個数 空間複雑度:O(1) 203.チェーンテーブル要素の除去
タイトルの説明
チェーンテーブルの値valに等しいすべてのノードを削除します.
私の初歩的な考えは:2つの前後のポインタを定義、後のポインタは現在の状態curr、前のポインタは前のprevを表す. 現在の値がvalであればprev.next=curr.next,後方遍歴:curr=curr.next. これにより、val値を表すノードが削除される.
もちろん、削除する複数の要素がヘッダノードに現れることは考えていませんが、これを考えると、哨兵ノードのメリットが現れます.
哨兵ノードの利用
削除する1つ以上のノードがチェーンテーブルの頭部にある場合、歩哨ノードを使用してチェーンテーブルを標準化することができ、チェーンテーブルが空でなくても、頭がなくなくなくても、挿入と削除の操作を簡素化することができます.疑似ヘッドとして哨兵ノードを定義できる.sentinel: 「真頭」headを指さす: 2つのポインタを定義し、1つは前方ポインタprev、1つは現在のポインタcurrとする. currの値が指定値であれば、prevの次のノードが現在のノードの次の系ノードを指すようにする. currの値が指定値でなければ、前のノードを表すポインタprevを現在のポインタに向けさせる. currは常に後ろを回っている.
最後にsentinelに戻る.next.(prevとsentinelは同じアドレスを指し、prevはチェーンテーブルの操作を完了した) コード実装
複雑度分析時間複雑度:O(n) 空間複雑度:O(1) 82.並べ替えチェーンテーブルの重複要素IIを削除する
タイトルの説明
並べ替えチェーンテーブルを指定し、重複する数値を含むすべてのノードを削除し、元のチェーンテーブルに重複していない数値だけを保持します.
同じようにチェーンテーブルの重複要素を削除して、最初の問題は1つ残しておけばいいので、この問題の意味は1つ残さないことです.次の点に注意してください.チェーンテーブルは並べ替えられている. 削除したノードはヘッダノードである可能性がある.
この問題は、哨兵ノードを利用することができます.
コード実装
複雑度分析時間複雑度:O(n) 空間複雑度:O(1) 参照リンク:https://leetcode-cn.com/problems/remove-linked-list-elements/solution/yi-chu-lian-biao-yuan-su-by-leetcode/
https://leetcode-cn.com/problems/remove-duplicates-from-sorted-list/solution/shan-chu-pai-xu-lian-biao-zhong-de-zhong-fu-yuan-s/
チェーンテーブル要素の削除:歩哨ノード
83.ソートチェーンテーブルの重複要素Iを削除する
タイトルの説明
ソートチェーンテーブルを指定し、重複するすべての要素を削除して、各要素が一度だけ表示されるようにします.
これは星を描く簡単な問題で、難易度はあまり高くありません.注意すべき点は次のとおりです.
コード実装
public static ListNode deleteDuplicates(ListNode head){
//
ListNode currNode = head;
// , next next
while(currNode!=null&&currNode.next!=null){
if(currNode.val==currNode.next.val){
currNode.next = currNode.next.next;
}else{
// ,
currNode = currNode.next;
}
}
return head;
}
複雑度分析
タイトルの説明
チェーンテーブルの値valに等しいすべてのノードを削除します.
私の初歩的な考えは:
もちろん、削除する複数の要素がヘッダノードに現れることは考えていませんが、これを考えると、哨兵ノードのメリットが現れます.
哨兵ノードの利用
削除する1つ以上のノードがチェーンテーブルの頭部にある場合、歩哨ノードを使用してチェーンテーブルを標準化することができ、チェーンテーブルが空でなくても、頭がなくなくなくても、挿入と削除の操作を簡素化することができます.
ListNode sentinel = new ListNode(0);
sentinel.next = head;
public ListNode sentinelRemove(ListNode head,int val){
// , head
ListNode sentinel = new ListNode(0);
sentinel.next = head;
// , , head
ListNode prev = sentinel;
ListNode curr = head;
while(curr!=null){
if(curr.val == val){
// , next
prev.next = curr.next;
}else{
//
prev = curr;
}
//
curr = curr.next;
}
//
return sentinel.next;
}
複雑度分析
タイトルの説明
並べ替えチェーンテーブルを指定し、重複する数値を含むすべてのノードを削除し、元のチェーンテーブルに重複していない数値だけを保持します.
同じようにチェーンテーブルの重複要素を削除して、最初の問題は1つ残しておけばいいので、この問題の意味は1つ残さないことです.次の点に注意してください.
この問題は、哨兵ノードを利用することができます.
コード実装
public ListNode deleteDuplicates(ListNode head) {
// , head
ListNode sentinel = new ListNode(0);
sentinel.next = head;
ListNode prev = sentinel,curr = head;
//
while(curr!=null&&curr.next!=null){
//
if(curr.val == curr.next.val){
// , curr
int val = curr.val;
while(curr!=null&&curr.val==val){
curr = curr.next;
}
//
prev.next = curr;
}else{
//
//
prev = curr;
curr = curr.next;
}
}
return sentinel.next;
}
複雑度分析
https://leetcode-cn.com/problems/remove-duplicates-from-sorted-list/solution/shan-chu-pai-xu-lian-biao-zhong-de-zhong-fu-yuan-s/