编写代码,移除未排序的链表中的重复节点
2019独角兽企业重金招聘Python工程师标准>>>
解法一:如果不得使用临时缓冲区,该怎么解决?
要想移除链表中的重复节点,我们需要设法记录有哪些是重复的。这里只需要使用到一个简单的散列表。
在下面的解法中,我们会直接迭代访问整个链表,将每个节点加入到散列表。若发现有重复的元素,将该节点从链表中移除,然后继续迭代。这个题目使用了链表,因此只需要扫描一次就能搞定。
deleteDups()的时间复杂度为O(N),其中N为链表节点数目。
解法二:不使用缓冲区
如不借助额外的缓冲区,可以用两个指针来迭代:current迭代访问整个链表,runner用于检查后续的节点是否重复
上述代码中的deleteDups2()
该代码的空间复杂度为O(1),时间复杂度为O(N2)
package cglib;
import java.util.Hashtable;
class LinkedListNode<T> {
public LinkedListNode<T> next;
public T data;
public LinkedListNode(Object object, int data2, Object object2) {
}
}
public class StringNumber {
private LinkedListNode<Integer> head;
private LinkedListNode<Integer> tail;
private int size;
// 尾部插入
public boolean addTail(int data) {
if (this.head == null) {
this.head = new LinkedListNode<Integer>(null, data, null);
this.tail = this.head;
} else {
LinkedListNode<Integer> newnode = new LinkedListNode<Integer>(this.tail, data, null);
this.tail.next = newnode;
this.tail = newnode;
}
this.size++;
return true;
}
public String toString() {
if (this.isEmpty())
return "[]";
else {
StringBuffer st = new StringBuffer("[");
for (LinkedListNode<Integer> curent = this.head; curent != null; curent = curent.next)
st.append(curent.data.toString() + " ,");
st.append("]");
return st.toString();
}
}
public boolean isEmpty() {
return this.size == 0;
}
public void deleteDups(LinkedListNode<Integer> n){
Hashtable<Integer, Boolean> table = new Hashtable<Integer, Boolean>();
LinkedListNode<Integer> previous = null;
while(n != null){
if(table.containsKey(n.data)){
previous.next = n.next;
}else{
table.put(n.data, true);
previous = n;
}
n =n.next;
}
while(head!=null){
System.out.println(head.data.toString());
head= head.next;
}
}
public void deleteDups2(LinkedListNode<Integer> head){
if(head == null)
return;
LinkedListNode<Integer> current = head;
while(current != null){
//移除后续值相同的所有节点
LinkedListNode<Integer> runner = current;
while(runner.next != null){
if(runner.next.data == current.data){
runner.next = runner.next.next;
}else{
runner = runner.next;
}
}
current= current.next;
}
while(head!=null){
System.out.println(head.data.toString());
head= head.next;
}
}
public static void main(String[] args){
StringNumber test = new StringNumber();
test.addTail(1);
test.addTail(2);
test.addTail(3);
test.addTail(3);
test.addTail(4);
test.addTail(1);
test.deleteDups2(test.head);
}
}
- public static void deleteDups(LinkListNode n) {
- LinkListNode previous = null;
- Hashtable table = new Hashtable();
- while(n != null){
- if (table.containsKeys(n.data)) {
- preious.next = n.next;
- }
- else {
- table.put(n.data, true);
- previous = n;
- }
- n = n.next;
- }
- }
- public static void deleteDupsNew(LinkListNode head) {
- if (head == null) return;
- LinkListNode current = head;
- while(current != null){
- LinkListNode runner = current;
- while (runner.next != null){
- if(runner.next.data == current.data){
- runner.next = runner.next.next;
- }
- else{
- runner = runner.next;
- }
- }
- current = current.next;
- }
- }
或者:
public class ListNote {private ListNote NextNote;private int value;public ListNote(){ }public ListNote(int value){this.value=value;} public ListNote getNext(){ return NextNote; }public void setNext(ListNote next){this.NextNote=next; } public int getValue(){return value; }public void setValue(int value){this.value=value;}
}
public static void deleteDuplication(ListNote root){if(root==null){return;}ListNote preNode=null;//前结点ListNote node=root;//当前结点while(node!=null){ListNote nextNode=node.getNext();//下一个结点boolean needDelete=false;
//判断当前结点和下一个结点值是否相等 if(nextNode!=null&&nextNode.getValue()==node.getValue())needDelete=true;if(!needDelete){//不相等,向前移动preNode=node;node=node.getNext(); }else{//相等,删除该结点int value=node.getValue();ListNote toBeDel=node;while(toBeDel!=null&&toBeDel.getValue()==value){nextNode=toBeDel.getNext();//删除该结点toBeDel=nextNode;} if(preNode==null){//头结点删除时root=nextNode;}else{//即删除了重复结点preNode.setNext(nextNode);}node=nextNode;}}}
转载于:https://my.oschina.net/u/2822116/blog/788183
编写代码,移除未排序的链表中的重复节点相关推荐
- Java 移除重复节点 | 编写代码,移除未排序链表中的重复节点。保留最开始出现的节点。
移除重复节点 难度简单97 编写代码,移除未排序链表中的重复节点.保留最开始出现的节点. 示例1: 输入:[1, 2, 3, 3, 2, 1]输出:[1, 2, 3] 示例2: 输入:[1, 1, 1 ...
- 移除未排序链表中的重复节点,保留最开始出现的节点
编写代码,移除未排序链表中的重复节点.保留最开始出现的节点. 示例1: 输入:[1, 2, 3, 3, 2, 1]输出:[1, 2, 3] 示例2: 输入:[1, 1, 1, 1, 2]输出:[1, ...
- C语言从已排序的链表中删除重复项(附完整源码)
C语言从已排序的链表中删除重复项 C语言从已排序的链表中删除重复项完整源码(定义,实现,main函数测试) C语言从已排序的链表中删除重复项完整源码(定义,实现,main函数测试) #include ...
- 删除单链表中的重复节点(c语言版本)
这是一道经典的面试题,下面是我的研究和举一反三,特整理如下: 分为三种情形: (1)删除有序链表的重复节点,重复节点一个都不留 (2)删除有序链表的重复节点,重复节点只留一个 (3)删除无序链表的重复 ...
- 删除单链表中的重复节点
删除单链表中的重复节点 一.题目描述 已知单链表L,写一算法,删除其中的重复节点.(更好的阅读体验,请访问程序员在旅途) 二.分析解答 2.1 知识点分析 本题主要考察链表的相关知识点,其中包括:单链 ...
- 每天一道LeetCode-----移除有序链表中的重复节点
Remove Duplicates from Sorted List 原题链接Remove Duplicates from Sorted List 给定一个有序链表,对于链表中所有重复元素,只保留一个 ...
- 编写代码,移除未排序链表中的重复节点。保留最开始出现的节点。
class Solution { public ListNode removeDuplicateNodes(ListNode head) { Set set = new HashSet<> ...
- 力扣:编写代码,移除未排序链表中的重复节点。保留最开始出现的节点。
class Solution { public:ListNode* removeDuplicateNodes(ListNode* head) {ListNode *p=head;ListNode *q ...
- 老虎-删除排序链表中的重复节点
题目:1-1-2-3-3-3-4-5-6-6-7,删除重复节点后返回2-4-5-7 def delete_duplicate(head):h = Node(0)k = hp = headif not ...
最新文章
- UVa11300 Spreading the Wealth(数学问题)
- 机器学习排序之Learning to Rank简单介绍
- android的三个基础控件,Android基础控件——ProgressBar自定义的介绍、动画效果实现、附加三个漂亮的进度条...
- 数学图形之SineSurface与粽子曲面
- 从零开始nodejs系列文章
- oc 实例变量可见度、方法
- 百度机器同传技术及应用小记
- Linux操作系统使用基础05:Linux磁盘与文件系统管理
- SC命令---安装、开启、配置、关闭windows服务 bat批处理(转载)
- 完美解决:此地址使用了一个通常用于网络浏览以外目的的端口.出于安全原因,Firefox 取消了该请求...
- 【优化模型】推销员问题模型
- python求斜率_python – 在曲线上找到斜率变化的位置
- 【BZOJ1062】糖果雨(NOI2008)-数形结合+二维树状数组
- 腾讯 Techo Hub 2022 年首站落地福州|723,与开发者们探讨工业数字化!
- java 线框图_你真的搞懂什么是线框图,什么是原型图了吗?
- 第一讲:计算机基本结构
- 【MMDetection3D】MVXNet踩坑笔记
- 光栅原理及其c语言仿真,光栅原理及MATLAB仿真
- TCP-IP详解卷1-3分享
- BRDF·基于物理的着色技术学习总结
热门文章
- 物联网技术周报第 145 期: ESP8266 和 IFTTT 自制 WiFi 智能秤
- Java关键字——instanceof
- 【深入剖析Tomcat笔记】第一篇 基础知识储备
- 调用ajax后页面为什么会刷新,为什么页面在JQuery ajax调用之后重新加载?
- AWS — AWS Direct Connect
- 分布式消息队列 — RabbitMQ(3)
- 安卓蓝牙调试软件和微信小程序搜索不到设备
- 扩展屏幕没有连接,但程序窗口还在扩展屏幕上,在看不到这个屏幕的情况下,把程序窗口拉回来的方法
- 大型互联网b2b b2c o2o电子商务云平台
- 史上第二走心的 iOS11 Drag Drop 教程