元のタイトル:
最初にコードを貼り付けます。
public class Solution82 {
public ListNode deleteDuplicates(ListNode head) {
//判断链表是否为空的情况
if (head == null){
return head;
}
//创建一个数组list用来存放链表中重复出现的数
ArrayList<Integer> list = new ArrayList<>();
ListNode ret = head;
//将链表中重复出现的数存入list中
while (ret.next != null){
if (ret.val == ret.next.val){
list.add(ret.val);
}
ret = ret.next;
}
ListNode newhead = new ListNode(-1);
newhead.next = head;
ret = newhead;
//遍历链表,若各节点的值在数组list中出现,则删除这个节点
while (ret.next != null){
if (list.contains(ret.next.val)){
ret.next = ret.next.next;
}else {
ret = ret.next;
}
}
return newhead.next;
}
}
問題解決のアイデア:
タイトルには、重複番号のあるすべてのノードを削除したいので、前の考えでは問題を解決できないと書かれています。まず、リンクリストをトラバースして、重複番号を個別に抽出する必要があります。現時点では、次の2つの方法があります。 1つは、これらの数値を格納する動的配列を直接作成することです。2つ目は、リンクリストをトラバースするときに数値を抽出し、前のノードと次のノードの値が数値であるかどうかを判断することです。ここでは、最初の方法を使用します。タイトルから、このリンクリストはすでに昇順のリンクリストであることがわかるので、繰り返し番号を接続する必要があり、次のノードの値を判断するだけで済みます。
最初のステップは、動的配列ArrayListを作成することです。
2番目のステップは、配列をトラバースし、繰り返される各数値を配列リストに格納することです。これは、このノードの値が次のノードの値と等しいかどうかを判断することです。等しい場合は、繰り返されたことを意味します。配列リストに格納されます:
3番目のステップでは、リンクリスト内の重複する値の削除を開始します。最初に、元のリンクリストの開始を判断できるように、新しい仮想ヘッドノードnewheadを作成する必要があります。
配列リストにこのノードの値が含まれている場合、このノードの次のフィールドは、このノードの次のノードを指し、削除操作を完了します。
最後に、リンクリストが空の場合について説明しましょう。