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 + '\'' +
'}';
}
}
六、java双向链表
最新推荐文章于 2020-03-27 21:05:41 发布