区别链表与数组
链表与数组
-
1.什么是链表
-
链表是一种数据结构,用来储存数据,但是内存中的地址值不连续,有一系列的节点组成,由前一个数据指向下一个节点这样的方式相互连接,长度可变,可分为单向链表和双向链表。
-
2.什么是数组
-
数组是在内存中连续存储的具有相同类型的一组数据的集合,且长度不可变
- 优缺点
- 链表链表采用动态内存分配的方式,在内存中不连续 ,支持动态增加或者删除元素 ,链表的查询效率低,每次都需要遍历。
- 数组有下标,可以访问任意下标的元素,数组在内存中连续,数组元素增加时,有可能会数组越界, 数组元素减少时,会造成内存浪费,数组增删时需要移动其它元素。
-
简单链表
import java.util.ArrayList;
public class LinkedNode {
//测试链表
public static void main(String[] args) {
//创建节点
HeroNode heroNode1 = new HeroNode(1, "da", "pp");
HeroNode heroNode2 = new HeroNode(2, "de", "po");
HeroNode heroNode3 = new HeroNode(3, "dp", "pi");
//创建链表
link link = new link();
//添加数据
link.add(heroNode1);
//列出数据
link.list();
}
}
//创建链表主方法
class link {
private HeroNode head = new HeroNode(0, "", "");
//添加节点
public void add(HeroNode heroNode) {
//创建出下一个节点
HeroNode temp = head;
while (true) {
if (temp.next == null) {
break;
}
temp = temp.next;
}
//传递节点的内容
temp.next = heroNode;
}
//读取节点的内容
public void list() {
//判断是否为空
if (head.next == null) {
System.out.println("空");
return;
}
HeroNode temp = head.next;
while (true) {
if (temp == null) {
break;
}
System.out.println(temp);
temp = temp.next;
}
}
}
class HeroNode {
private int id;
private String name;
private String uname;
public HeroNode next;
public HeroNode(int id, String name, String uname) {
this.id = id;
this.name = name;
this.uname = uname;
}
@Override
public String toString() {
return "HeroNode{" +
"id=" + id +
", name='" + name + '\'' +
", uname='" + uname + '\'' +
'}';
}
}
创建自己的链表首先要创建一个节点类,定义相关的节点信息,包括相关的属性,以及节点的创建;
第二步就要写一些相关的方法来定义我们的链表,其中最主要的就是创建头节点,private HeroNode head = new HeroNode(0, "", "");,
然后就可以增加一些基本方法(增删改查)增加、删除都是以要增加或删除的节点的前一个节点为基础来进行的,因为需要改变之后各个节点的顺序。
算法突破
[点这儿](26. 删除有序数组中的重复项 - 力扣(LeetCode) (leetcode-cn.com)).
class Solution {
public int removeDuplicates(int[] nums) {
Set<Integer> m1 = new HashSet<>();
for (int i = 0; i < nums.length; i++) {
m1.add(nums[i]);
}
Iterator it = m1.iterator();
while (it.hasNext()) {
for (int i = 0; i < m1.size(); i++) {
nums[i] = (int)it.next();
}
}
Arrays.sort(nums,0,m1.size());
for (int i = 0; i < nums.length; i++) {
System.out.print(nums[i]+" ");
}
return m1.size();
}
}
这道题的重点在于去重,去重最简单的方法就是使用set集合,然后将数组进行遍历,添加进集合中,之后再从集合中取出,但是为啥数组中重复的元素会排到后边,而不是消失,暂时还没理解,理解后在说吧。