本文已参与「新人创作礼」活动,一起开启掘金创作之路
Java算法与数据结构——单链表
链表
链式存储结构 内存不连续 以节点的方式存储 节点包含数据域和指针域 链表分带有节点和无头节点的链表
单链表
各种操作的依赖
无论插入删除修改遍历我们所需要的实际上只需要让一个新节点(temp【在c里就是指针,Java中没有指针的概念,但其实就是类节点】)获取到我们要进行操作的链表就行
主要
搞清怎么操作指针域就行
temp = head
temp = temp.next
代码
链表节点
package linklist;
public class ListNode {
public int id;
//数据域
public String data;
//指针域
public ListNode next;
public ListNode(int id,String data){
this.id = id;
this.data = data;
}
@Override
public String toString() {
return "ListNode{" +
"id=" + id +
", data='" + data + '\'' +
'}';
}
}
单链表实体类
package linklist;
public class SingleLinkList {
//先初始化一个头节点,头节点不存放具体数据
private ListNode head;
public void initSingLinkList() {
head = new ListNode(0, "");
}
//添加节点
public void insertNode(ListNode listNode) {
//使用temp指针进行遍历
ListNode temp = head;
while (true) {
if (temp.next == null) {
break;
}
temp = temp.next;
}
temp.next = listNode;
}
//打印链表
public void showSingleLinkList() {
if (isEmpty()) {
return;
}
ListNode temp = head.next;
while (true) {
if (temp == null) {
return;
}
System.out.println(temp);
temp = temp.next;
}
}
//判断链表是否为空
public boolean isEmpty() {
if (head.next == null) {
System.out.println("链表为空");
return true;
}
return false;
}
//按照id顺序添加节点
public void insertByOrder(ListNode listNode) {
ListNode temp = head;
boolean flag = false;
while (true) {
if (temp.next == null) {
break;
}
if (temp.next.id > listNode.id) {
break;
} else if (temp.next.id == listNode.id) {
flag = true;
break;
}
temp = temp.next;
}
if (flag == true) {
System.out.println("准备插入的数据编号已存在,无法添加");
} else {
listNode.next = temp.next;
temp.next = listNode;
System.out.println("插入成功");
}
}
//修改节点数据
public void updateNode(ListNode listNode) {
ListNode temp = head;
boolean flag = false;
while (true) {
if (temp.next == null) {
break;
}
if (temp.id == listNode.id) {
flag = true;
break;
}
temp = temp.next;
}
if (flag) {
temp.data = listNode.data;
} else {
System.out.println("没有找到要修改的节点");
}
}
//删除节点
public void delNode(int id) {
ListNode temp = head;
boolean flag = false;
while (true) {
if (temp.next == null) {
break;
}
if (temp.next.id == id) {
flag = true;
break;
}
temp = temp.next;
}
if (flag) {
temp.next = temp.next.next;
} else {
System.out.println("要删除的节点不存在");
}
}
//获取头节点
public void getHeadNode() {
ListNode temp = head;
if (temp.next == null && temp.id == 0) {
System.out.println("该链表为空无法获取头节点");
} else {
temp = temp.next;
System.out.println("头节点为:" + temp);
}
}
//获取尾节点
public void getTailNode() {
ListNode temp = head;
boolean flag = false;
while (true) {
if (temp.next == null && temp.id == 0) {
System.out.println("该链表为空无法获取尾节点");
break;
}
if (temp.next == null) {
flag = true;
break;
}
temp = temp.next;
}
if (flag) {
System.out.println("尾节点为:" + temp);
} else {
System.out.println("无法找到该节点");
}
}
//清空链表
public void clearLinkList() {
ListNode temp = head;
boolean flag = false;
while (true) {
if (temp.next == null && temp.id == 0) {
System.out.println("该链表为空无法清空");
break;
}
temp = temp.next;
temp.data = "";
if (temp.next == null) {
flag = true;
break;
}
}
if (flag) {
System.out.println("清空完成");
}
}
//获取长度
public void getLength() {
ListNode temp = head;
int length = 0;
while (true) {
if (temp.next == null && temp.id == 0) {
System.out.println("该链表为空长度为"+length);
break;
}
temp = temp.next;
length++;
if (temp.next == null) {
System.out.println("该链表为空长度为"+length);
break;
}
}
}
}
测试类
package linklist;
import java.util.Scanner;
public class SingleLinkListTest {
public static void main(String[] args) {
SingleLinkList singleLinkList = new SingleLinkList();
int choose = -1;
Scanner sc = new Scanner(System.in);
boolean flag = true;
while (flag) {
System.out.println("============================");
System.out.println("=========1.初始化队列========");
System.out.println("=========2.添加节点=========");
System.out.println("=========3.显示单链表=========");
System.out.println("=========4.删除单链表节点========");
System.out.println("=========5.获取头节点(指id = 1)========");
System.out.println("=========6.获取单链表长度======");
System.out.println("=========7.清空单链表=========");
System.out.println("=========8.销毁单链表=========");
System.out.println("=========9.获取尾节点========");
System.out.println("=========10.修改节点数据========");
System.out.println("=========0.退出exit=========");
System.out.println("============================");
System.out.println("请输入你的选择:");
choose = sc.nextInt();
if (choose == 0) {
System.out.println("exit...");
break;
}
switch (choose) {
case 1:
singleLinkList.initSingLinkList();
break;
case 2:
System.out.println("输入你要添加的数据:");
System.out.println("输入编号(大于等于1)");
int id = sc.nextInt();
System.out.println("输入你要添加的内容");
String data = sc.next();
ListNode listNode = new ListNode(id,data);
singleLinkList.insertByOrder(listNode);
break;
case 3:
System.out.println("当前列表为:");
singleLinkList.showSingleLinkList();
break;
case 4:
System.out.println("请输入你要移除的节点编号(大于等于0)");
int delId =sc.nextInt();
singleLinkList.delNode(delId);
break;
case 5:
singleLinkList.getHeadNode();
break;
case 6:
singleLinkList.getLength();
break;
case 7:
singleLinkList.clearLinkList();
break;
case 8:
singleLinkList = null;
System.out.println("已销毁--》自动停止程序》》》");
System.exit(0);
break;
case 9:
singleLinkList.getTailNode();
break;
case 10:
System.out.println("输入你要添加的数据:");
System.out.println("输入编号(大于等于1)");
int newId = sc.nextInt();
System.out.println("输入你要添加的内容");
String newData = sc.next();
ListNode newlistNode = new ListNode(newId,newData);
singleLinkList.updateNode(newlistNode);
break;
default:
System.out.println("error");
break;
}
}
}
}
程序截图