来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/remove-duplicates-from-sorted-list
题目
Given a sorted linked list, delete all duplicates such that each element appear only once.
给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。
Example 1:
Input: 1->1->2
Output: 1->2
Example 2:
Input: 1->1->2->3->3
Output: 1->2->3
解题思路:
通过两个额外的指针实现
1个指针 combFirst 指向重复的第一个节点 , 另一个指针 index 进行遍历。
当发现 当前节点(第一个重复点) 与下一个节点重复
- 则 combFirst 指向 该节点, 并保持不动。
- index 继续向下移动,直到index节点的值和 combFirst的值不一致。
- 把combFrist 的next 指向 index节点。
当不重复
- index向下移动
- combFirst 执向indx
代码
package com.offer.test.leetcode;
//Given a sorted linked list, delete all duplicates such that each element appear only once.
// Example 1:
// Input: 1->1->2
// Output: 1->2
// Example 2:
// Input: 1->1->2->3->3
// Output: 1->2->3
class ListNode {
int val;
ListNode next;
ListNode() {
}
ListNode(int val) {
this.val = val;
}
ListNode(int val, ListNode next) {
this.val = val;
this.next = next;
}
}
/**
* Created by szh on 2020/6/2.
*/
public class DelDuplicateElement {
public static ListNode deleteDuplicates(ListNode head) {
if (head == null || head.next == null) {
return head;
}
ListNode indexNode = head;
ListNode combFirst = indexNode;
while (indexNode != null) {
if (indexNode.next != null && indexNode.next.val == combFirst.val) {
combFirst = indexNode;
indexNode = indexNode.next;
while (indexNode != null && indexNode.val == combFirst.val) {
indexNode = indexNode.next;
}
combFirst.next = indexNode;
combFirst = indexNode;
} else {
indexNode = indexNode.next;
combFirst = indexNode;
}
}
return head;
}
public static void main(String[] args) {
ListNode _1 = new ListNode(1);
ListNode _2 = new ListNode(1);
ListNode _3 = new ListNode(2);
ListNode _4 = new ListNode(2);
ListNode _5 = new ListNode(3);
ListNode _6 = new ListNode(3);
_1.next = _2;
_2.next = _3;
_3.next = _4;
_4.next = _5;
_5.next = _6;
ListNode a = deleteDuplicates(_1);
while (a != null) {
System.out.println(a.val);
a = a.next;
}
}
}
注意:
if (indexNode.next != null && indexNode.next.val == combFirst.val)
的反面包含了两种情况
1.indeNode.next == null
2.indexnode next != null && indexNode.next.val != combFirst.val