双链表的基本操作(基于JAVA)
双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。一般我们都构造双向循环链表。单链表只可以从一个方向查找,而双链表可以前后查找。双链表是由data域、next域(指向下一节点)、pre域(指向上一节点)组成的。
双链表的应用(对银行账户信息的处理):
(1)添加(默认添加到双链表的最后端)
首先通过遍历以及辅助指针temp找到最后的这个节点
temp.next = newBankNode
newBankNode.pre = temp
(2)双向链表的遍历
定义一个当前节点cur指针,然后进行遍历,每遍历一次把cur输出
(3)修改节点
定义一个当前节点cur指针,然后进行遍历
遍历的时候如果找到cur.no = newBankNode.no,那么找到修改的节点进行修改
(4)删除节点
定义一个当前节点cur指针,然后进行遍历
遍历的时候如果找到cur.no = newBankNode.no,那么就找到需要删除的节点
然后cur.pre.next = cur.next
cur.next.pre = cur.pre
以下为实现代码:
package com.java;
import java.util.Scanner;
public class DoubleLinkedListDemo {
public static void main(String[] args) {
DoubleLinkedList doubleLinkedList = new DoubleLinkedList();
BankNode1 bankNode1 = new BankNode1(1101, "马一", 100);
BankNode1 bankNode2 = new BankNode1(1102, "马二", 10000000);
BankNode1 bankNode3 = new BankNode1(1103, "马三", 10000000);
doubleLinkedList.add(bankNode1);
doubleLinkedList.add(bankNode2);
doubleLinkedList.add(bankNode3);
boolean loop = true;
Scanner scanner = new Scanner(System.in);
while (loop)
{
System.out.println("show------显示单链表-----");
System.out.println("add-------增加节点-------");
System.out.println("head------获取头节点------");
System.out.println("update-----修改节点------");
System.out.println("del-------删除节点-------");
System.out.println("exit-------退出----------");
String key = scanner.next();
switch (key)
{
case "show":
doubleLinkedList.list();
break;
case "add":
System.out.println("请分别输入账户、姓名、余额");
int no_add = scanner.nextInt();
String name_add = scanner.next();
long money_add = scanner.nextLong();
doubleLinkedList.add(new BankNode1(no_add,name_add,money_add));
break;
case "head":
doubleLinkedList.getHead();
break;
case "update":
System.out.println("请分别输入需要修改的账户、姓名、余额");
int no_update = scanner.nextInt();
String name_update = scanner.next();
long money_update = scanner.nextLong();
doubleLinkedList.update(new BankNode1(no_update,name_update,money_update));
break;
case "del":
System.out.println("请输入需要删除的账号");
int no_del = scanner.nextInt();
doubleLinkedList.del(no_del);
break;
case "exit":
scanner.close();
loop = false;
break;
default:
break;
}
}
System.out.println("退出程序~~~~~~~");
}
}
class DoubleLinkedList
{
BankNode1 head = new BankNode1(0,"",0);
public BankNode1 getHead()
{
return head;
}
public void list()
{
if(head.next == null){
System.out.println("链表为空!");
return ;
}
BankNode1 cur = head.next;
while (cur != null)
{
System.out.println(cur);
cur = cur.next;
}
}
public void add(BankNode1 newBankNode1)
{
BankNode1 cur = head;
while (cur != null)
{
if (cur.next == null) break;
cur = cur.next;
}
cur.next = newBankNode1;
newBankNode1.pre = cur;
System.out.println("添加成功");
}
public void update(BankNode1 newBankNode1)
{
if (head.next == null)
{
System.out.println("链表为空");
return;
}
BankNode1 cur = head.next;
boolean flag = false;
while (cur != null)
{
if (cur.no == newBankNode1.no)
{
flag = true;
break;
}
cur = cur.next;
}
if (flag)
{
cur.name = newBankNode1.name;
cur.money = newBankNode1.money;
}
System.out.println("修改成功!");
}
public void del(int no)
{
if (head.next == null)
{
System.out.println("链表为空");
return;
}
BankNode1 cur = head;
boolean flag = false;
while (cur != null)
{
if (cur.no == no)
{
flag = true;
break;
}
cur = cur.next;
}
if (flag) {
cur.pre.next = cur.next;
if (cur.next != null) {
cur.next.pre = cur.pre;
}
}
System.out.println("删除成功!");
}
}
class BankNode1
{
public int no;
public String name;
public long money;
public BankNode1 pre;
public BankNode1 next;
public BankNode1(int no, String name, long money) {
this.no = no;
this.name = name;
this.money = money;
}
@Override
public String toString() {
return "BankNode1{" +
"no=" + no +
", name='" + name + '\'' +
", money=" + money +
'}';
}
}