题目
给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回已排序的链表。
示例 1:
输入:head = [1,1,2]
输出:[1,2]
示例 2:
输入:head = [1,1,2,3,3]
输出:[1,2,3]
提示:
链表中节点数目在范围 [0, 300] 内
-100 <= Node.val <= 100
题目数据保证链表已经按升序排列
思路
- 如何找重复元素?=>多个相邻的节点值是相同的。=>引入prev节点和cur节点, 比较prev节点的值和其下一个节点值是否相同。(向后多看一个节点)
- 找到重复元素后,如何让重复元素只保留一次?=>保留第一个重复节点(prev指向的节点),删除cur对应的节点。
- 当cur为空时,判断终止。
代码
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode deleteDuplicates(ListNode head) {
ListNode dummyHead = new ListNode(101); //虚拟头节点的赋值要根据每道题目的提示信息来
dummyHead.next = head;
ListNode prev = dummyHead;
ListNode cur = prev.next;
while(cur != null) {
if(prev.val != cur.val) {
prev = prev.next;
} else {
//此时cur是需要删除的节点
prev.next = cur.next;
}
cur = cur.next;
}
return dummyHead.next;
}
}