本篇文章主要是记录Java的链表的创建、插入、修改、删除、查询等。
链表和数组的区别?
- 从线性关系来看,链表和数组一样都是线性表;
- 从内存结构来看,链表的内存空间是不连续的,数组的内存空间是连续的;
- 从数据存储来看,链表的每个节点都有两个域,一个是数据域,专门用来存储值的;一个是指针域,用来存储下一节点的地址。
链表和数组的优劣比较:
- 链表增加、删除快,查找慢;数组增加、删除慢,查找快;
- 链表消耗的内存更大,因为每个节点除了存储数据之外,还需要存储下一节点的地址;
代码实现如下:
import java.util.Scanner;
class ListNode {
int value;
ListNode next;
ListNode() {
}
ListNode(int value) {
this.value = value;
this.next = null;
}
/**
* 初始化链表
*
* @return
*/
public static ListNode init() {
Scanner sc = new Scanner(System.in);
System.out.print("请输入添加链表的长度:");
int n = sc.nextInt();
ListNode headNode = new ListNode(n);
ListNode nextNode = headNode;
for (int i = 0; i < n; i++) {
System.out.print("请输入第" + (i + 1) + "个节点的值:");
int temp = sc.nextInt();
ListNode node = new ListNode(temp);
nextNode.next = node;
nextNode = nextNode.next;
}
return headNode;
}
/**
* 打印输出链表
*
* @param listNode
*/
public void print(ListNode listNode) {
if (listNode == null || listNode.next == null) {
return;
}
ListNode ln = listNode.next;
while (ln != null) {
System.out.println(ln.value);
ln = ln.next;
}
}
/**
* 修改指定位置链表的值
*
* @param listNode:修改的链表
* @param n:修改位置
* @param value:修改后的值
* @return
*/
public String update(ListNode listNode, int n, int value) {
ListNode ln = listNode.next;
if (listNode == null || ln == null || listNode.value < n) {
return "该链表为空或链表未初始化";
}
for (int i = 0; i < n; i++) {
ln = ln.next;
}
ln.value = value;
return "更改成功!!";
}
/**
* 计算链表的长度
*
* @param listNode:链表
* @return
*/
public int size(ListNode listNode) {
ListNode ln = listNode.next;
int n = 0;
while (ln != null) {
n++;
ln = ln.next;
}
return n;
}
/**
* 指定位置添加链表节点
*
* @param listNode:添加的链表
* @param n:添加的位置
* @param value:添加的值
* @return
*/
public void add(ListNode listNode, int n, int value) {
ListNode ln = listNode.next;
ListNode node = new ListNode(value);
if (ln == null || n == 1) {
node.next = listNode.next;
listNode.next = node;
return;
}
int j = 0;
while (j < n - 2 && ln != null) {
j++;
if (ln.next == null) {
break;
}
ln = ln.next;
}
if (ln.next != null) {
node.next = ln.next;
}
ln.next = node;
}
/**
* 指定位置删除链表节点
*
* @param listNode:删除的链表
* @param value:删除的值
* @return
*/
public void del(ListNode listNode, int value) {
ListNode ln = listNode.next;
if (ln != null && ln.value == value) {
listNode.next = ln.next;
}
ListNode temp = ln.next;
while (temp != null) {
if (temp.value == value) {
ln.next = temp.next;
break;
}
ln = temp;
temp = temp.next;
}
}
/**
* 查找链表
*
* @param listNode:查找的链表
* @param value:查找的值
* @return
*/
public void find(ListNode listNode, int value) {
ListNode ln = listNode.next;
while (ln != null) {
if (ln.value == value) {
System.out.println("找到该值!!");
return;
}
ln = ln.next;
}
System.out.println("找不到该值!!");
}
}
public class LinkedList {
public static void main(String[] args) {
ListNode init = ListNode.init();
// init.del(init,2);
// init.add(init, 3, 44);
init.find(init, 3);
// System.out.println(init.update(init, 5, 5));
init.print(init);
// System.out.println(init.size(init));
// listNode.print(init);
}
}
本文为学习笔记,所参考文章均已附上链接,若有疑问请私信!
创作不易,如果对你有点帮助的话麻烦点个赞支持一下!
新手小白,欢迎留言指正!