给定一个已排序的链表的头 head
, 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。
示例 1:
输入:head = [1,1,2] 输出:[1,2]
示例 2:
输入:head = [1,1,2,3,3] 输出:[1,2,3]
提示:
- 链表中节点数目在范围
[0, 300]
内 -100 <= Node.val <= 100
- 题目数据保证链表已经按升序 排列
题解(双指针)
- 定义fir用来存储不重复或者重复元素的第一个元素,sec来判读这个元素是否重复
- fir.val==sec.val.那么就删除sec的结点,fir.next=sec.next sec++,为什么fir不能++,因为删除一个重复元素,可能后面的结点还是重复元素,所以还需要当前的fir与sec判断
- fir.val!=sec.val,那么就fir++ sec++
- 当sec=null,就结束
Java代码实现
public ListNode deleteDuplicates(ListNode head) { if (head==null){//如果链表为空,直接返回 return null; } ListNode fir=head; ListNode sec=head.next; while (sec!=null){ if (fir.val==sec.val){//如果相等,删除sec结点 fir.next=sec.next; sec=sec.next; }else {//如果不等,两个指针都后移 fir=fir.next; sec=sec.next; } } return head; }
题解(递归)
JAVA代码实现
public ListNode deleteDuplicates(ListNode head) { //终止条件 if (head == null || head.next == null) { return head; } ListNode nextNode = deleteDuplicates(head.next); if (head.val == nextNode.val) {//如果头结点更返回链表的头结点的值相同 return nextNode; }else {//如果头节点的值跟返回的链表的头节点值不同 head.next=nextNode; return head; } }