目录
一、删除所有重复元素,使每个元素只出现一次
给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回已排序的链表 。
1.1带头链表解法
首先,我们要排除链表为空的情况。另一种可以直接返回的情况就是头结点的后继节点为空,如果只有一个结点那么肯定不存在重复元素的问题, 所以以上两种情况可以直接返回head。
如何能知到哪个节点是重复结点,判断这一点一定会牵扯到两个结点之间的比较,如果prev.val == cur.val name说明prev和cur是两个重复的节点。
所以我们要创建一个带头链表dummyHead,使他的第一个数为-101(其实为多少都可以,因为这个结点是不进入循环判断的,判断的是他的后继节点)然后让dummyHead.next = head,使自己创建的带头链表和给的单链表做出联系。
已经判断过head和head.next非空,则使prev = dummyHead.next并且cur = prev.next。
prev指向的可以是第一个重复的节点,因为要保存它,也可以指向不重复的结点。cur就是要和prev判断的结点,如果两个值相等那么cur和prev.next就需要向后移,这个时候中间重复的结点就已经被删除了,这个过程会一直进行到cur和prev不再相等。
当移动到不相等的时候,prev 就可以移动了prev= prev.next,然后cur = cur.next,继续进行下一次判判断
最后只要返回dummyHead.next就能返回没有重复元素的链表了。
public ListNode deleteDuplicates(ListNode head) {
if (head == null || head.next == null) {
return head;
}
ListNode dummyHead = new ListNode(-101);
dummyHead.next = head;
ListNode prev = dummyHead.next;
ListNode cur = prev.next;
while (cur != null) {
if(prev.val == cur.val) {
prev.next = cur.next;
}else {
prev = prev.next;
}
cur = cur.next;
}
return dummyHead.next;
}
也可以直接使用单链表解法,不需要创建一个单独的虚拟头结点直接将prev指向head即可 ,其他相同。