408算法练习——删除有序链表中的重复元素

删除重复元素

题目链接https://leetcode-cn.com/problems/remove-duplicates-from-sorted-list-ii/

一、问题描述

存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除链表中所有存在数字重复情况的节点,只保留原始链表中 没有重复出现 的数字。返回同样按升序排列的结果链表。

 

示例 1:

输入:head = [1,2,3,3,4,4,5]
输出:[1,2,5]


示例 2:

输入:head = [1,1,1,2,3]
输出:[2,3]
 

提示:

链表中节点数目在范围 [0, 300] 内
-100 <= Node.val <= 100
题目数据保证链表已经按升序排列

 

二、问题分析

  首先想到的是双指针,通过双指针把重复元素的区域划分出来,然后重新连接链表,并跳过被划分出的区域

 

三、算法设计

  需要两个指针,指针i总是指向重复区域的前一个位置,指针j指向重复区域的最后一个元素,这样i.next和j就对应重复区域的边界

  

 1 /**
 2  * Definition for singly-linked list.
 3  * public class ListNode {
 4  *     int val;
 5  *     ListNode next;
 6  *     ListNode() {}
 7  *     ListNode(int val) { this.val = val; }
 8  *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 9  * }
10  */
11 class Solution {
12     public ListNode deleteDuplicates(ListNode head) {
13         if(head==null){
14             return head;
15         }
16         ListNode nhead = new ListNode();
17         nhead.next=head;
18         ListNode i=nhead;
19         ListNode j=i.next;
20         while(j.next!=null){
21             if(i.next.val != j.next.val){
22                 i = i.next;
23                 j = j.next;
24             }else{//如果等于说明有重复元素,找出重复区间并跳过
25                 while(i.next.val == j.val && j.next!=null){
26                     j = j.next;
27                 }
28                 if(j.next == null && i.next.val == j.val){//j是链表最后一个元素且j也是重复元素
29                     i.next = null;
30                 }else {
31                     i.next = j;
32                     
33                 }
34             }
35         }
36         return nhead.next;
37     }
38 }

 

posted @ 2021-07-24 20:38  瑜琦  阅读(116)  评论(0)    收藏  举报