此博客链接:https://www.cnblogs.com/ping2yingshi/p/12682141.html
删除排序链表中的重复元素 II(103)
此博客链接:https://leetcode-cn.com/problems/remove-duplicates-from-sorted-list-ii/
给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字。
示例 1:
输入: 1->2->3->3->4->4->5
输出: 1->2->5
示例 2:
输入: 1->1->1->2->3
输出: 2->3
题解:
说明:此题和上面一题不同之处在于,上一道题删除重复数字,但是保留一个数字,此题是只要是重复的都删除,不保留。
思路:使用两个指针,一个指针判断当前值和后面的值是否相等,相等就指向下一个数。排除相同数字。另外一个指针指向第一个指针,把不相同的数字加入到链表中。
过程:一开始真是怎么都不对,报空指针异常,真是找了半天错误,才发现原来是判断前一个数和后一个是否相等时的while中,需要先判断q指针的next是否为空。
错误代码如下:
class Solution { public ListNode deleteDuplicates(ListNode head) { if(head==null||head.next==null) return head; ListNode result=new ListNode(0); result.next=head; ListNode p=result;//记录指针 ListNode q=result.next;//判断指针 while(q!=null) { if(q.next!=null&&q.val==q.next.val) { while(q.val==q.next.val&&q.next!=null) { q=q.next; } p.next=q.next; q=q.next; } else { p=p.next; q=q.next; } } return result.next; } }
正确代码:
class Solution { public ListNode deleteDuplicates(ListNode head) { if(head==null||head.next==null) return head; ListNode result=new ListNode(0); result.next=head; ListNode p=result;//记录指针 ListNode q=result.next;//判断指针 while(q!=null) { if(q.next!=null&&q.val==q.next.val) { while(q.next!=nullq.val==q.next.val) { q=q.next; } p.next=q.next; q=q.next; } else { p=p.next; q=q.next; } } return result.next; } }