連結リスト OJ (7) 順序付き連結リストの繰り返し要素を削除する -I -II

目次

順序付きリスト内の重複要素を削除 -I

順序付きリストの重複要素を削除-II


順序付きリスト内の重複要素を削除 -I

説明

指定されたリンク リスト内の繰り返し要素を削除します (リンク リスト内の要素は小さいものから大きいものへと並べられます)。これにより、リンク リスト内のすべての要素が 1 回だけ表示されます
。たとえば、
指定されたリンク リストは 1→1→21→ です。 1→2, return 1→21 →2.
与えられた連結リストは 1→1→2→3→31→1→2→3→3, return 1→2→31→2→3.

【解決策1】ハッシュトラバーサル削除(この方法は次の2つの質問に適しています)

ハッシュ テーブルを 1 回走査して各要素の出現回数をカウントし、2 回目に走査して 2 回以上出現するすべてのノード要素を削除する

【解決策2】直接削除する

 削除するにはダミーノード pre を使用します. pre と cur の値が等しい場合は pre を使用して cur を削除します. 等しくない場合は一緒に移動します.

class Solution {
public:
    ListNode* deleteDuplicates(ListNode* head) {
        // write code here
        auto newhead = new ListNode(-1);
        newhead->next = head;
        auto pre = newhead, cur = head;
        while(cur)
        {
            if(cur->val == pre->val)
            {
                pre->next = cur->next;    // 相等进行删除
                cur = pre->next;
            }
            else {
                pre = pre->next;    // 不相等后移
                cur = cur->next;
            }
        }
        return newhead->next;
    }
};

 順序付きリストの重複要素を削除-II

説明

昇順で並べ替えられた連結リストが与えられた場合、連結リストで繰り返されるすべての要素を削除し、元の連結リストに 1 回だけ表示される要素のみを保持します。
例:
指定された連結リストは 1→2→3→3→4→4→51→2→3→3→4→4→5 で、1→2→51→2→5 を返します。
1→1→1→2→31→1→1→2→3、2→32→3を返す。

【解決策1】直接削除する

 pre を使用して後ろに等しい要素を持つノードを削除し、その都度 Next を定義し、Next を使用して cur と比較し、Next の値が cur と等しい場合、Next は引き続き後方に移動します (Next は空であると判断されることに注意してください)。 )、Until nullptr または cur と等しくないノードが見つかるまで、pre を使用して途中で等しいノードを削除します。

 nullptr または cur と等しくないノードが見つかるまで、pre を使用して中間の等しいノードを削除します。

class Solution {
public:
    ListNode* deleteDuplicates(ListNode* head) {
        // write code here
        ListNode* newhead = new ListNode(-1);
        newhead->next = head;
        auto pre = newhead, cur = head, Next = head;
        while(cur)
        {
            Next = cur->next;
            if(Next && cur->val == Next->val)
            {
                while(Next && cur->val == Next->val)
                {
                    Next = Next->next;    // Next遍历至最后一个不相等结点或者空节点
                }
                pre->next = Next;    // 利用pre进行删除
                cur = Next;        // 更新cur
            }
            else {
                pre = pre->next;    // 如果俩结点不相等,cur pre一起后移
                cur = cur->next;
            }
        }
        return newhead->next;
    }
};

【解決策2】ハッシュトラバーサル削除

ハッシュ テーブルを 1 回走査して各要素の出現回数をカウントし、2 回目に走査して 2 回以上出現するすべてのノード要素を削除する

 

おすすめ

転載: blog.csdn.net/weixin_66151870/article/details/129108066