题解 | #删除有序链表中重复的元素-II#
删除有序链表中重复的元素-II
https://www.nowcoder.com/practice/71cef9f8b5564579bf7ed93fbe0b2024
import java.util.*; /* * public class ListNode { * int val; * ListNode next = null; * public ListNode(int val) { * this.val = val; * } * } */ public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param head ListNode类 * @return ListNode类 */ public ListNode deleteDuplicates (ListNode head) { // write code here if(head==null||head.next==null){ return head; } ListNode L = new ListNode(0); L.next=head; ListNode pre = L; ListNode p = head; while(p!=null){ ListNode q=p.next; boolean flag=false; while(q!=null){ if(p.val==q.val){ flag=true; q=q.next; pre.next=q; }else{ break; } } if(pre!=null){ if(!flag){ pre=pre.next; } p=pre.next; }else{ p=null; } } return L.next; } }
思路:由于要删除所有重复的结点,而头结点可能会和后面的结点相同,所以可能被删除,此时就需要设置头指针了,用于指向新结点。需要注意的是由于结点p会被删除,所以需要一个前驱结点指向不重复的结点。还有就是删除与否pre的变动情况不同,因此,设置了标志flag。最终所有结点遍历后,重复节点被删除,返回头指针指向的链表即可。