给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。
示例 1:
输入:head = [1,1,2]
输出:[1,2]
示例 2:
输入:head = [1,1,2,3,3]
输出:[1,2,3]
提示:
链表中节点数目在范围 [0, 300] 内
-100 <= Node.val <= 100
题目数据保证链表已经按升序 排列
package cn.fansunion.leecode.linkedlist;
/**
* 删除排序链表中的重复元素。
* 给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。
* 力扣
* @author wen.lei@brgroup.com
*
* 2022-1-28
*/
public class RemoveDuplicatesFromSortedList {
/**
* 一次遍历搞定(网上还有递归版的解法,对于本题,递归解法不够简单明了,没必要)
* 输入:head = [1,1,1,2,3,3];输出:[1,2,3]
* @param head
* @return
*/
public ListNode deleteDuplicates(ListNode head) {
//利用链表的“指针”特性,遍历链表,通过修改next放弃中间重复节点来删除重复的节点
//当前节点,默认为头
ListNode current = head;
//next不为null,current头尾很可能为null,需要判断
while(current!=null && current.next!=null) {
//next节点,相对于current的next
ListNode next= current.next;
//当前节点和下一个节点重复,修改当前节点的next指针跳过next
//当前节点current“索引没变”,由于next变了,继续遍历current
if(current.val==next.val) {
current.next=next.next;
}else {
//遇到不重复的元素,进入到下一个不同数字的节点
current=current.next;
}
}
return head;
}
}
package test.leecode.linkedlist;
import org.junit.Assert;
import org.junit.Test;
import cn.fansunion.leecode.linkedlist.ListNode;
import cn.fansunion.leecode.linkedlist.RemoveDuplicatesFromSortedList;
/**
* @author wen.lei@brgroup.com
*
* 2022-2-15
*/
public class RemoveDuplicatesFromSortedListTest {
@Test
public void test() {
RemoveDuplicatesFromSortedList list = new RemoveDuplicatesFromSortedList();
//1,1,1,2,3,3
ListNode node3A = new ListNode(3,null);
ListNode node3 = new ListNode(3,node3A);
ListNode node2 = new ListNode(2,node3);
ListNode node1A = new ListNode(1,node2);
ListNode node1 = new ListNode(1,node1A);
ListNode head = new ListNode(1,node1);
list.deleteDuplicates(head);
Assert.assertEquals(1, head.val);
Assert.assertEquals(2, head.next.val);
Assert.assertEquals(3, head.next.next.val);
Assert.assertEquals(null, head.next.next.next);
}
}