题目:
给定一个已排序的链表的头 head , 删除原始链表中所有重复数字的节点,只留下不同的数字 。返回 已排序的链表 。
示例 1:
输入:head = [1,2,3,3,4,4,5]
输出:[1,2,5]
示例2:
输入:head = [1,1,1,2,3]
输出:[2,3]
解析:
方法:双指针 + 虚拟头节点
使用虚拟头节点简化边界情况处理(特别是头节点可能被删除的情况)
用两个指针:
r:指向已确认不重复的最后一个节点
q:探索当前节点后面是否有重复值
- 通过判断 q 是否移动来确定当前节点是否重复
具体代码:
/** * Definition for singly-linked list. * function ListNode(val, next) { * this.val = (val===undefined ? 0 : val) * this.next = (next===undefined ? null : next) * } *//** * @param {ListNode} head * @return {ListNode} */vardeleteDuplicates=function(head){//设置虚拟头结点letpre=newListNode(0,head);//设置指针指向虚拟头结点letr=pre;while(r.next){letq=r.nextwhile(q.next&&q.val===q.next.val){q=q.next}if(q===r.next){r=r.next}else{r.next=q.next}}returnpre.next};