题目描述
存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除所有重复的元素,使每个元素 只出现一次 。
返回同样按升序排列的结果链表。
示例 1:
输入:head = [1,1,2] 输出:[1,2] 示例 2:
输入:head = [1,1,2,3,3] 输出:[1,2,3]
提示:
链表中节点数目在范围 [0, 300] 内 -100 <= Node.val <= 100 题目数据保证链表已经按升序排列
来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/re… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
题解思路
定义两个指针pre(前指针)和cur(后指针)因为给定链表是升序链表,所以只要比较相邻两个节点的值是否相等,如果相等则让cur移动一步,直到cur与pre的值不相等,此时让pre指向cur即可删除重复的节点,当cur指向null时结束循环。此时让pre指向null即可。
题解代码
* 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}
*/
var deleteDuplicates = function(head) {
if(!head) return null;
let pre = head,cur = head.next;//定义两个指针,比较两个节点值是否相等
//cur不为null则链表没有走完
while(cur){
//值不相等时,让pre指向cur,pre与cur向后移动一步
if(cur.val !== pre.val){
pre.next = cur;
pre = cur;
cur = cur.next;
}else{
cur = cur.next;//值相等时,只需要让cur向后移动一步,继续比较与pre的值
}
}
//由于循环结束时cur指向的是null,pre指向的并不一定为空
//因此需要将pre指向null结束链表
pre.next = null;
return head;
};