2020-08-24

双链表的基本操作(基于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);
    //1、获取头结点
    public BankNode1 getHead()
    {
        return head;
    }
    //2、遍历双向链表
    public void list()
    {
        //判断链表是否为空
        if(head.next == null){
            System.out.println("链表为空!");
            return ;
        }
        //声明一个cur指针,保存当前的节点
        BankNode1 cur = head.next;
        while (cur != null)
        {
            System.out.println(cur);
            cur = cur.next;
        }

    }
    //3、添加节点(添加在最后面)
    public void add(BankNode1 newBankNode1)
    {

        //声明一个cur指针,用于存放当前节点
        BankNode1 cur = head;
        while (cur != null)
        {
            if (cur.next == null) break;//此时找到最后一个节点
            cur = cur.next;
        }
        //形成双链表的步骤
        cur.next = newBankNode1;
        newBankNode1.pre = cur;
        System.out.println("添加成功");
    }

    //4、修改节点内容
    public void update(BankNode1 newBankNode1)
    {
        if (head.next == null)
        {
            System.out.println("链表为空");
            return;
        }
        //声明一个cur指针,用于存放当前节点
        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("修改成功!");
    }

    //5、删除节点
    public void del(int no)
    {
        //判断链表是否为空
        if (head.next == null)
        {
            System.out.println("链表为空");
            return;
        }
        //声明一个cur指针,指向当前节点
        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 +
                '}';
    }
}

猜你喜欢

转载自blog.csdn.net/zzFZJ_/article/details/108191328