目次
順序付きリスト内の重複要素を削除 -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 回以上出現するすべてのノード要素を削除する