リンクリスト内の重複する要素を削除します
タイトル説明:
昇順で並べられたリンクリストがあります。このリンクリストのヘッドノードを指定し
head
て、各要素が1回だけ表示されるように、重複するすべての要素を削除してください 。昇順でソートされた結果のリンクリストを返します。
例:
入力:[1,2,2,3,3]
出力:[1,2,3]
アイデア:
リンクリストはソートされたリンクリストであるため、リンクリスト内の繰り返される要素の位置も連続しています。リンクリスト内の重複する要素を削除するには、リンクリストをトラバースするだけで済みます。
- 現在がリンクリストのヘッドノードを指し、現在がリンクリストのヘッドノードからトラバースするようにします。
- current.nextの値がcurrent.nextの値と等しい場合は、current.next;を削除します(current.nextがcurrent.next.nextを指すようにします)
- それ以外の場合は、current.next == nullになるまでcurrentを逆方向に移動させます
コード:
class Solution {
public ListNode deleteDuplicates(ListNode head) {
if(head == null || head.next == null){
return head;
}
//不会删除头节点
ListNode current = head;
while(current.next!= null){
if(current.val == current.next.val){
current.next = current.next.next;
}else{
current = current.next;
}
}
return head;
}
}
リンクリストIIの重複要素を削除する
タイトル説明:
昇順で並べられたリンクリストがあります。このリンクリストのヘッドノードヘッドを指定します。リンクリスト内で番号が繰り返されているノードをすべて削除し、元のリンクリストで繰り返されていない番号のみを保持してください。
結果のリンクリストを昇順で返します
例:
入力:[1,2,3,3,4,4,5]
出力:[1,2,5]
アイデア:
上記のように、重複ノードもトラバーサルによって削除されます。
重複する要素はすべて削除されるため、リンクリストのヘッドノードが削除される可能性があるため、ダミーノードを使用してリンクリストのヘッドノードをポイントします。
- prevがパペットノードを指し、currentがリンクリストのヘッドノードを指すようにします。
- current.nextの値と等しい場合、currentがcurrent.nextを指すようにします。
- 等しくない場合は、prevとcurrentの間にノードがあるかどうかを判断し、prevなしで逆方向に進みます。そうでない場合、prev.nextはcurrent.nextを指します(繰り返される要素をスキップします)
- currentがnullでない限り、currentを最後まで戻します。
コード:
class Solution {
public ListNode deleteDuplicates(ListNode head) {
//删除排序链表中的重复元素
if(head == null|| head.next == null){
return head;
}
//可能会删除head节点,所有用虚拟节点
ListNode newHead = new ListNode(-1);
newHead.next = head;
ListNode prev = newHead;
ListNode current = head;
while (current != null){
while (current.next != null && current.val == current.next.val){
current = current.next;
}
if (prev.next == current){
//prev和current之间没有重复的节点,prev向后移动
prev = prev.next;
}else {
//跳过了重复的元素
prev.next= current.next;
}
current = current.next;
}
return newHead.next;
}
}