题目
存在一个按升序排列的链表,给你这个链表的头节点 `head` ,请你删除所有重复的元素,使每个元素只出现一次。
返回同样按升序排列的结果链表。
示例
输入:1 -> 1 -> 2
输出:1 -> 2
代码实现
直接遍历
主要思路
1. 直接在链表上遍历节点,改变节点指针指向
2. 如果当前节点的值和下一个节点的值相等,将当前节点指向下一个节点的下一个节点
3. 否则继续遍历下一个节点
public ListNode deleteDuplicates(ListNode head) {
if(head == null || head.next == null){
return head
}
ListNode cur = head
while(cur.next != null){
if(cur.val == cur.next.val){
cur.next = cur.next.next
}else{
cur = cur.next
}
}
return head
}
虚拟头结点
主要思路
1. 我们还可以通过虚拟头结点来构建一个新的链表,该链表不包括重复元素
2. 只有当新链表的节点值与原链表的值不同时,才将原链表的的节点加到新链表中
3. 最后返回虚拟头结点的下一个节点,也就是新链表的头结点
public ListNode deleteDuplicates(ListNode head) {
if(head == null || head.next == null){
return head
}
ListNode dummty = new ListNode(-109)
ListNode tail = dummty
while(head != null){
if(tail.val != head.val){
tail.next = head
tail = tail.next
}
head = head.next
}
tail.next = null
return dummty.next
}