移除链表中的重复节点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
    评论
Java 链表(Linked List)是一种常见的数据结构,用于存储和操作一系列元素。Java 提供了多种链表实现,其最常见的是 LinkedList 类和 ArrayList 类。 LinkedList 是一个双向链表的实现,它通过节点之间的链接来存储元素。每个节点都包含一个存储的元素以及一个指向前一个节点和后一个节点的引用。由于它是双向链表,因此可以在任何位置快速插入或删除元素。 下面是一个简的示例,展示如何使用 LinkedList 存储和操作数据: ```java import java.util.LinkedList; public class LinkedListExample { public static void main(String[] args) { // 创建一个 LinkedList 实例 LinkedList<String> linkedList = new LinkedList<>(); // 添加元素到链表末尾 linkedList.add("apple"); linkedList.add("banana"); linkedList.add("orange"); // 在指定位置插入元素 linkedList.add(1, "grape"); // 获取指定位置的元素 String fruit = linkedList.get(2); System.out.println("Fruit at index 2: " + fruit); // 遍历所有元素 for (String item : linkedList) { System.out.println(item); } // 除指定位置的元素 linkedList.remove(0); // 检查链表是否为空 boolean isEmpty = linkedList.isEmpty(); System.out.println("Is linked list empty: " + isEmpty); } } ``` 以上代码演示了如何创建一个 LinkedList 实例,添加元素,获取元素,遍历元素,删除元素以及检查链表是否为空。 除了 LinkedList,Java 还提供了 ArrayList 类,它是基于数组的实现。ArrayList 与 LinkedList 相比,在随机访问和修改操作上更高效,但在插入和删除操作上较慢。选择使用哪种链表实现取决于具体的需求和使用场景。 希望这个简的示例能帮助你理解链表Java 的使用。如果有更多问题,请随时提问!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值