程序员代码面试指南第二版 24.删除无序链表中值重复出现的节点

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了程序员代码面试指南第二版 24.删除无序链表中值重复出现的节点相关的知识,希望对你有一定的参考价值。


​welcome to my blog​

程序员代码面试指南第二版 24.删除无序链表中值重复出现的节点

题目描述

给定一个无序链表,删除其中值重复出现的节点(保留当中顺序遍历第一个出现的节点)。

输入描述:
第一行一个整数 n,表示单链表的节点数量。
第二行 n 个整数表示单链表的节点的值。

输出描述:
顺序输出单链表每个节点的值。

示例1

输入
5
1 3 2 3 1

输出
1 3 2

第一次做; 使用选择排序的思想, 拿时间换空间; 时间复杂度O(n^2), 空间复杂度O(1); 注意外层循环中left指针的更新; 牛客网暂时通不过这种方法

import java.util.Scanner;

public class Main
public static void main(String[] args)
Scanner sc = new Scanner(System.in);
int n = Integer.parseInt(sc.nextLine());
//input check
if(n < 1)
return;
String[] str = sc.nextLine().split(" ");
//创建链表
ListNode head = new ListNode(Integer.parseInt(str[0]));
ListNode curr = head;
for(int i=1; i<n; i++)
curr.next = new ListNode(Integer.parseInt(str[i]));
curr = curr.next;

//execute
//法一: 时间复杂度O(n^2), 空间复杂度O(1)
curr = head;
ListNode left = head, right;
while(curr!=null)
right = curr.next;
while(right!=null)
if(right.val==curr.val)
left.next = right.next;
//update
right = right.next;

else
left = left.next;
right = right.next;


//注意外层循环中left指针的更新
left = curr.next;
curr = curr.next;

//打印结果
curr = head;
while(curr!=null)
System.out.print(curr.val+" ");
curr = curr.next;


public static class ListNode
int val;
ListNode next;
ListNode(int val)
this.val = val;


第一次做; 使用哈希表; 时间复杂度O(n), 空间复杂度O(n)

import java.util.Scanner;
import java.util.Set;
import java.util.HashSet;

public class Main
public static void main(String[] args)
Scanner sc = new Scanner(System.in);
int n = Integer.parseInt(sc.nextLine());
//input check
if(n < 1)
return;
String[] str = sc.nextLine().split(" ");
//创建链表
ListNode head = new ListNode(Integer.parseInt(str[0]));
ListNode curr = head;
for(int i=1; i<n; i++)
curr.next = new ListNode(Integer.parseInt(str[i]));
curr = curr.next;

//execute
//法一: 时间复杂度O(n), 空间复杂度O(n)
Set<Integer> set = new HashSet<>();
//头结点一定会保留下来
ListNode left = head;
set.add(head.val);
curr = head.next;
while(curr!=null)
if(set.contains(curr.val))
left.next = curr.next;
curr = curr.next;

else
set.add(curr.val);
left = curr;
curr = curr.next;


//打印结果
curr = head;
while(curr!=null)
System.out.print(curr.val+" ");
curr = curr.next;


public static class ListNode
int val;
ListNode next;
ListNode(int val)
this.val = val;



以上是关于程序员代码面试指南第二版 24.删除无序链表中值重复出现的节点的主要内容,如果未能解决你的问题,请参考以下文章

[程序员代码面试指南]链表问题-删除无序链表中重复出现的节点

程序员代码面试指南第二版 156.设计LRU缓存结构

程序员代码面试指南第二版 11.可见的山峰对数量(普通和进阶)

[程序员代码面试指南]链表问题-单链表的选择排序(选择排序)

删除无序链表中值最的节点.C语言实现.2016-04 自考真题

剑指Offer面试题18. 删除链表的节点