83. 删除排序链表中的重复元素

157 阅读1分钟

题目介绍

力扣83题:leetcode-cn.com/problems/re…

image.png

image.png

分析

由于给定的链表是排好序的,因此重复的元素在链表中出现的位置是连续的,因此我们只需要对链表进行一次遍历,就可以删除重复的元素。

具体地,初始时pre指针指向头节点,我们从指 cur 指向链表的头节点的下一个节点开始,随后开始对链表进行遍历。如果当前 curpre 对应的元素相同,那么我们就将cur指向的节点从链表中移除;否则说明链表中已经不存在其它与cur 对应的元素相同的节点,因此可以将 cur 指向cur.next

当遍历完整个链表之后,我们返回链表的头节点即可。

代码如下:

/**
 * 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) {
        if(head == null || head.next == null) {
            return head;
        }
        ListNode pre = head;
        ListNode cur = head.next;
        while(cur != null) {
            //存在元素值相同的节点
            if(pre.val == cur.val) {
                pre.next = cur.next;
                cur = cur.next;               
            }else {
                pre = cur;
                cur = cur.next;
            }  
        }
        return head;
    }
}