移除链表中的重复节点java_[java] 单链表实战 删除重复节点

[java] 单链表实战 删除重复节点

寒光博客 • 2019 年 10 月 12 日

题目

移除未排序链表中的重复节点

进阶:

不得使用临时缓冲区 怎么解决

思路:

缓冲区 hashset 重复判断 然后删除

缓冲区 代码

package _09_Linear;

import java.util.HashSet;

public class RemoveRepeitionNode {

private static class Node {

Object value;

Node next;

public Node(Object value) {

this.value = value;

}

}

public static void main(String[] args) {

int arr[] = {1, 6, 4, 2, 7, 6, 8, 1};

Node head = new Node(null);//哑元

Node p = head;

for (int i = 0; i < arr.length; i++) {

p.next = new Node(arr[i]);

p = p.next;

}

rr(head);//有缓冲区

// rr2(head);//无缓冲区

Node p1 = head.next;

while (p1 != null) {

System.out.println(p1.value);

p1 = p1.next;

}

}

/**

* 使用缓冲区

*

* @param head

*/

private static void rr(Node head) {

HashSet set = new HashSet();//开辟新空间

Node p1 = head.next;

Node pre = head;

while (p1 != null) {

if (set.contains(p1.value)) {//重复

System.out.println("delete:" + p1.value);

pre.next = p1.next;//删除

} else {

set.add(p1.value);//加入队列

pre = p1;//更新前驱pre 很重要!!! 注意理解

}

p1 = p1.next;

}

}

}

非缓冲区

建立一个哨兵 然后依次后移哨兵

每个哨兵对其后面的所有元素进行一轮比较 查重复 删除

/**

* 无缓冲区 删除重复节点

* 使用哨兵 检测 重复

*

* @param head

*/

private static void rr2(Node head) {

Node pre = head;

Node p = pre.next;

while (p != null) {

Node sentry = p;//哨兵 并保持不变

while (p.next != null) {//从哨兵之后开始比较

if (sentry.value == p.next.value) {// 重复

p.next = p.next.next;

} else {

p = p.next;

}

}

p = pre;//恢复p

p = p.next;//p后移

pre = p;//保存p

}

System.out.println(":asdasd");

}

tip:删除重复节点的两种方法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值