双链表的基本操作(基于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 +
'}' ;
}
}