单链表的具体操作(基于JAVA)
单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象) + 指针(指示后继元素存储位置),元素就是存储数据的存储单元,指针就是连接每个结点的地址数据。
即:每个节点包含data域、next域(指向下一个节点)
单链表的应用(使用带头结点的单链表实现银行账户的管理):
(1)第一种添加节点方法,直接添加到单链表的尾部。
首先创建一个head头结点,里面不存放任何数据内容,作用是用来表示单链表的头结点
通过遍历找到最后一个节点,将最后一个节点的next指针指向需要添加的节点。
(2)通过指定的位置添加节点
通过遍历以及辅助指针temp预处理(单链表是否为空、需要添加的节点是否存在等),然后找到新添加节点的位置
将新的节点的next = temp.next
将temp.next = 新的节点
(3)修改指定节点
通过遍历以及辅助指针temp找到需要修改的节点
将temp.name = newNode.name
temp.money = newNode.money
(4)删除指定节点
接收需要删除节点的no
通过比那里找到需要删除节点的前一个节点
temp.next = temp.next.next
(5)打印单链表
预处理判断链表是否为空
通过遍历以及temp辅助指针遍历单链表并打印
(6)单链表的有效节点
声明一个length = 0
预处理判断单链表是否为空
通过遍历,每次length++,最后打印length
(7)查到单链表倒数第n个节点
接收倒数第n个节点,求出单链表长度size,定义辅助指针cur
遍历size - n次,此时的cur就为倒数第n个节点
(8)单链表的反转(这里使用头插法)
声明一个新的头节点(reverseHead)
通过遍历,把每次遍历到的节点都放在新的单链表(reverseHead)最前端
把原来链表head.next指向reversehead.next
(9)使用栈把单链表逆序输出出来
首先利用栈先进后出的道理,把各个节点压入栈中了,然后遍历输出即可逆序输出
以下为实现代码:
package com.java;
import java.util.Scanner;
import java.util.Stack;
public class SingleLinkedListDemo {
public static void main(String[] args) {
BankNode bankNode1 = new BankNode(1101,"马一",100);
BankNode bankNode2 = new BankNode(1102,"马二",1000000);
BankNode bankNode3 = new BankNode(1103,"马三",1000000);
SingleLinkedList singleLinkedList = new SingleLinkedList();
singleLinkedList.add(bankNode1);
singleLinkedList.add(bankNode2);
singleLinkedList.add(bankNode3);
boolean loop = true;
Scanner scanner = new Scanner(System.in);
while (loop)
{
System.out.println("-----------------------");
System.out.println("show----显示单链表-----");
System.out.println("add-----增加节点-------");
System.out.println("addBy--增加指定节点----");
System.out.println("del----删除指定节点----");
System.out.println("rev----单链表的反转----");
System.out.println("get----单链表的节长----");
System.out.println("i-----倒数第i个节点----");
System.out.println("stack--利用栈倒叙输出--");
System.out.println("exit------退出--------");
System.out.println("-----------------------");
String key = scanner.next();
switch (key)
{
case "show":
singleLinkedList.list();
break;
case "add":
System.out.println("请输入账户、名字、余额");
int no_add = scanner.nextInt();
String name_add = scanner.next();
long money_add = scanner.nextLong();
singleLinkedList.add(new BankNode(no_add,name_add,money_add));
break;
case "addBy":
System.out.println("请输入账户、名字、余额");
int no_byOrder = scanner.nextInt();
String name_byOrder = scanner.next();
long money_byOrder = scanner.nextLong();
singleLinkedList.addByOrder(new BankNode(no_byOrder,name_byOrder,money_byOrder));
break;
case "del":
System.out.println("请输入需要删除的银行账户");
int no_del = scanner.nextInt();
singleLinkedList.del(no_del);
break;
case "exit":
scanner.close();
loop = false;
break;
case "rev":
singleLinkedList.reverse();
break;
case "get":
System.out.println(singleLinkedList.getLength());
break;
case "i":
System.out.println("请输入倒数第i个数");
int index = scanner.nextInt();
System.out.println(singleLinkedList.findLastIndexNode(index));
break;
case "stack":
singleLinkedList.reverseShow();
break;
default:
break;
}
}
System.out.println("退出程序");
}
}
class SingleLinkedList {
BankNode head = new BankNode(0, "", 0);
public void add(BankNode bankNode) {
BankNode temp = head;
while (true) {
if (temp.next == null)
break;
else
temp = temp.next;
}
temp.next = bankNode;
}
public void addByOrder(BankNode bankNode) {
BankNode temp = head;
boolean flag = false;
while (true) {
if (temp.next == null)
break;
else if (temp.next.no == bankNode.no)
{
flag = true;
break;
} else if (temp.next.no > bankNode.no)
break;
temp = temp.next;
}
if (flag)
System.out.println("准备插入的银行账户" + bankNode.no + "已经存在");
else
{
bankNode.next = temp.next;
temp.next = bankNode;
}
}
public void update(BankNode newbankNode) {
if (head.next == null)
{
System.out.println("链表为空");
return;
}
BankNode temp = head;
boolean flag = false;
while (true) {
if (temp.next == null)
break;
else if (temp.no == newbankNode.no)
{
flag = true;
break;
}
temp = temp.next;
}
if (flag) {
temp.name = newbankNode.name;
temp.money = newbankNode.money;
} else {
System.out.println("没有找到需要修改的节点");
}
}
public void del(int no) {
if (head.next == null)
{
System.out.println("链表为空");
return;
}
boolean flag = false;
BankNode temp = head;
while (true) {
if (temp.next == null)
break;
else if (temp.next.no == no) {
flag = true;
break;
}
temp = temp.next;
}
if (flag) {
temp.next = temp.next.next;
} else
System.out.println("没有找到需要删除的" + no + "节点");
}
public void list() {
if (head.next == null)
{
System.out.println("链表为空");
return;
}
BankNode temp = head;
while (true) {
if (temp.next == null)
break;
temp = temp.next;
System.out.println(temp);
}
}
public int getLength()
{
int length = 0;
if (head.next == null) return 0;
BankNode cur = head.next;
while (cur != null)
{
length ++;
cur = cur.next;
}
return length;
}
public BankNode findLastIndexNode(int index)
{
if (head.next == null)return null;
int size = getLength();
if (index<0 || index>size) return null;
BankNode cur = head.next;
for (int i = 0; i < size - index; i++) {
cur = cur.next;
}
return cur;
}
public void reverse()
{
if (head.next == null||head.next.next == null) return;
BankNode cur = head.next;
BankNode next = null;
BankNode reverseHead = new BankNode(0,"",0);
while (cur != null)
{
next = cur.next;
reverseHead.next = cur;
cur.next = reverseHead.next;
cur = next;
}
head.next = reverseHead.next;
System.out.println("反转成功!!!!!!");
}
public void reverseShow()
{
if (head.next == null)return;
Stack<BankNode> stackNode = new Stack<BankNode>();
BankNode cur = head.next;
while (cur != null)
{
stackNode.push(cur);
cur = cur.next;
}
System.out.println("倒叙输出~~~~~~~~~~~");
while (stackNode.size() > 0)
{
System.out.println(stackNode.pop());
}
}
}
class BankNode
{
public int no;
public String name;
public long money;
public BankNode next;
public BankNode(int no,String name,long money)
{
this.no = no;
this.name = name;
this.money = money;
}
@Override
public String toString() {
return "BankNode[no = "+ no +",name = "+ name +",money = "+ money +"]";
}
}