まず、対象の説明:
ソートされたリストを考えると、すべてのノードが唯一のデジタル元のリストが繰り返しされていないままに、繰り返しの数字が含まれて削除します。
例1:
输入: 1->2->3->3->4->4->5
输出: 1->2->5
例2:
输入: 1->1->1->2->3
输出: 2->3
出典:滞在ボタン(LeetCode)
//leetcode-cn.com/problems/remove-duplicates-from-sorted-list-ii:リンク:httpsの
すべてのネットワークからの控除が著作権を保有。商業転載は、ソースを明記してください許可公式、非商用の転載をご連絡ください。
第二に、問題解決のアイデア:
1、及び要素が繰り返されているかどうかを見つけるために、リストをトラバース。
繰り返していない場合は2、現在のリストに新しい要素を追加し、新しいリストを作成します。
3、重複した場合は、重複ノードを削除します。
ソートされたリストを考える:その現在のリストと秩序、隣接する特定の要素を繰り返します。
第三に、コード説明:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode deleteDuplicates(ListNode head) {
//创建一个新链表
ListNode newHead=new ListNode(-1);
ListNode newTail=newHead;
ListNode cur=head;
while(cur!=null){
//针对某个引用进行 . 操作的时候, 必须保证该引用不能是 null
if(cur.next!=null&&cur.val==cur.next.val){
//当前元素是重复元素,查找重复元素区间。
while(cur.next!=null&&cur.val==cur.next.val){
cur=cur.next;
}
//while循环结束后,cur指向重复元素中的最后一个位置。
//cur向前再走一步,跳过了整个相同元素的区间。
cur=cur.next;
}
else{
//当前元素不是重复元素,插入到新链表中
newTail.next=new ListNode(cur.val);
newTail=newTail.next;
cur=cur.next;
}
}
return newHead.next;
}
}