六、java双向链表

package com.liaoxiang.linkedList;

import org.junit.Test;

/**
 * @auther Mr.Liao
 * @date 2019/7/20 11:00
 */
public class DoubleLinkedListDemo {
    @Test
    public void test1(){
        Person2 p1 = new Person2(1, "张三", "小张");
        Person2 p2 = new Person2(2, "李四", "老李");
        Person2 p3 = new Person2(3, "王五", "老王");
        Person2 p4 = new Person2(4, "赵六", "小赵");
        DoubleLinkedList list = new DoubleLinkedList();
        System.out.println("添加节点:");
        list.addPerson(p4);
        list.addPerson(p1);
        list.addPerson(p2);
        list.addPerson(p3);
        list.showList();
        System.out.println("修改节点:");
        Person2 p5 = new Person2(3, "王五", "隔壁老王");
        list.update(p5);
        list.showList();
        System.out.println("删除节点:");
        list.delete(3);
        list.showList();
    }
	添加节点:
	Person2{serialNumber=4, name='赵六', nickName='小赵'}
	Person2{serialNumber=1, name='张三', nickName='小张'}
	Person2{serialNumber=2, name='李四', nickName='老李'}
	Person2{serialNumber=3, name='王五', nickName='老王'}
	修改节点:
	Person2{serialNumber=4, name='赵六', nickName='小赵'}
	Person2{serialNumber=1, name='张三', nickName='小张'}
	Person2{serialNumber=2, name='李四', nickName='老李'}
	Person2{serialNumber=3, name='王五', nickName='隔壁老王'}
	删除节点:
	Person2{serialNumber=4, name='赵六', nickName='小赵'}
	Person2{serialNumber=1, name='张三', nickName='小张'}
	Person2{serialNumber=2, name='李四', nickName='老李'}
	
    @Test
    public void test2(){
        Person2 p1 = new Person2(1, "张三", "小张");
        Person2 p2 = new Person2(2, "李四", "老李");
        Person2 p3 = new Person2(3, "王五", "老王");
        Person2 p4 = new Person2(4, "赵六", "小赵");
        DoubleLinkedList list = new DoubleLinkedList();
        System.out.println("按照顺序添加:");
        list.addPersonByOrder(p3);
        list.addPersonByOrder(p1);
        list.addPersonByOrder(p4);
        list.addPersonByOrder(p2);
        list.showList();
    }
    按照顺序添加:
	Person2{serialNumber=1, name='张三', nickName='小张'}
	Person2{serialNumber=2, name='李四', nickName='老李'}
	Person2{serialNumber=3, name='王五', nickName='老王'}
	Person2{serialNumber=4, name='赵六', nickName='小赵'}
}
class DoubleLinkedList {
    private Person2 head = new Person2(0,"","");
    public Person2 getHead(){
        return head;
    }
    public void showList(){
        if (head.getNextPerson() == null) {
            System.out.println("链表为空");
            return;
        }
        Person2 temp = head.getNextPerson();
        while (true){
            if (temp == null){
                break;
            }
            System.out.println(temp);
            temp = temp.getNextPerson();
        }
    }
    public void addPerson(Person2 person2){
        Person2 temp = head;
        while (true){
            if (temp.getNextPerson() == null){
                break;
            }
            temp = temp.getNextPerson();
        }
        temp.setNextPerson(person2);
        person2.setPrePerson(temp);
    }
    public void addPersonByOrder(Person2 person2){
        Person2 temp = head;
        //用来标识该节点是否已经存在
        boolean flag = false;
        while(true){
            // 如果temp是链表的结尾,跳出循环
            if (temp.getNextPerson() == null){
                break;
            }
            //当temp的下一个节点的编号第一次大于将要添加元素的编号,则添加位置就在temp和这个节点之间
            if (temp.getNextPerson().getSerialNumber() > person2.getSerialNumber()){
                break;
            } else if (temp.getNextPerson().getSerialNumber() == person2.getSerialNumber()){
                flag = true;// 要添加的person的编号已经存在
                break;
            }
            // 上述的temp都不满足判断条件,则将temp指向的下一个节点赋值给temp继续判断
            temp = temp.getNextPerson();
        }
        //跳出循环之后,先判断flag的值,是否为true
        if (flag){
            System.out.println("该节点已经存在:"+person2.getName());
        } else {
            //让添加的新节点的nextPerson指向原temp指向的nextPerson,新添加的节点的prePerson指向temp
            person2.setNextPerson(temp.getNextPerson());
            person2.setPrePerson(temp);
            temp.setNextPerson(person2);
            //让temp指向的下一个的节点的prePerson指向添加的新节点
            if (temp.getNextPerson() != null) {
                temp.getNextPerson().setPrePerson(person2);
            }
        }
    }

    public void update(Person2 person){
        if (head.getNextPerson() == null) {
            System.out.println("链表为空");
            return;
        }
        //根据要修改节点的编号,在链表中找到该节点
        Person2 temp = head.getNextPerson();
        //用来标识是否找到该节点
        boolean flag = false;
        while(true){
            //找到节点
            if (temp.getSerialNumber() == person.getSerialNumber()){
                flag = true;
                break;
            }
            //已经到了链表的结尾,上一个temp.getNextPerson()没有指向任何节点了
            if (temp == null){
                break;
            }
            temp = temp.getNextPerson();
        }
        if (flag) {
            temp.setName(person.getName());
            temp.setNickName(person.getNickName());
        } else {
            System.out.println("链表中不存在该节点:"+person.getName());
        }
    }

    public void delete(Integer serialNumber){
        Person2 temp = head;
        boolean flag = false;
        while(true){
            //找到要删除的节点
            if (temp.getSerialNumber() == serialNumber){
                flag = true;
                break;
            }
            //temp为链表的最后一个节点
            if (temp.getNextPerson() == null){
                break;
            }
            temp = temp.getNextPerson();
        }
        if (flag){
            temp.getPrePerson().setNextPerson(temp.getNextPerson());
            if (temp.getNextPerson() != null){
                temp.getNextPerson().setPrePerson(temp.getPrePerson());
            }
        } else {
            System.out.println("未找到该节点:"+serialNumber);
        }
    }
}
class Person2 {
    private int serialNumber;
    private String name;
    private String nickName;
    private Person2 nextPerson;
    private Person2 prePerson;

    public int getSerialNumber() {
        return serialNumber;
    }

    public void setSerialNumber(int serialNumber) {
        this.serialNumber = serialNumber;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getNickName() {
        return nickName;
    }

    public void setNickName(String nickName) {
        this.nickName = nickName;
    }

    public Person2 getNextPerson() {
        return nextPerson;
    }

    public void setNextPerson(Person2 nextPerson) {
        this.nextPerson = nextPerson;
    }

    public Person2 getPrePerson() {
        return prePerson;
    }

    public void setPrePerson(Person2 prePerson) {
        this.prePerson = prePerson;
    }

    public Person2() {
    }

    public Person2(int serialNumber, String name, String nickName) {
        this.serialNumber = serialNumber;
        this.name = name;
        this.nickName = nickName;
    }

    @Override
    public String toString() {
        return "Person2{" +
                "serialNumber=" + serialNumber +
                ", name='" + name + '\'' +
                ", nickName='" + nickName + '\'' +
                '}';
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值