【链表】LeetCode83. 删除排序链表中的重复元素

146 阅读1分钟

题目

存在一个按升序排列的链表,给你这个链表的头节点 `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;
    }