之前分析了单链表的增删改查操作,双链表操作只是在此基础上稍微修改一下,可以作图辅助分析,这里直接上完整的代码。测试某个函数功能直接调用就行。新加了一个findforwardnode函数可以查找当前节点的前一个节点,可以测试是否是双向链表。
package com.linear.test;
/**
* @author ymm
* @create 2020-10-05 19:31
*/
public class DoubleLinkList {
public static void main(String []args)
{
Doublelist list = new Doublelist();
HeroNode2 link1=new HeroNode2(1,"宋江","及时雨");
HeroNode2 link2=new HeroNode2(2,"卢俊义","玉麒麟");
HeroNode2 link3=new HeroNode2(3,"吴用","智多星");
HeroNode2 link4=new HeroNode2(4,"林冲","豹子头");
HeroNode2 link5=new HeroNode2(1,"lingchong","baozitou");
list.AddByOrder(link1);
list.AddByOrder(link4);
list.AddByOrder(link3);
list.AddByOrder(link2);
//list.update(link5);
list.travel();
}
}
class Doublelist{
HeroNode2 head = new HeroNode2(0,"","");
//尾插链表,测试成功不报错
public void AddInTail(HeroNode2 newNode)
{
HeroNode2 temp=head;
while(temp.next!=null)
{
if(temp.heronum== newNode.heronum)
{
System.out.println("节点已经存在。不可重复插入\n");
return;
}
temp=temp.next;
}
temp.next=newNode;
newNode.pre=temp;
newNode.next=null;
}
//头插双链表,查找重复插入还是要遍历链表
public void AddInHead(HeroNode2 newNode)
{
if(head.next==null) //插入第一个节点时
{
head.next=newNode;
newNode.pre=head;
}
//不只一个节点时
else
{
newNode.next=head.next;
head.next.pre=newNode;
head.next=newNode;
newNode.pre=head;
}
}
//编号顺序插入,不同于单链表,可以直接定位到带插入位置处,因为可以双向链表可以找到前一个节点
public void AddByOrder(HeroNode2 newNode)
{
HeroNode2 temp=head;
boolean flag=false;
while(true)
{
//这里如果是1>4,现在插入3就不对,因为满足第一条件,还是要找前一个节点辅助
if(temp.next==null) //遍历到头就尾插
{
temp.next=newNode;
newNode.pre=temp;
flag=true;
}
if(temp.next.heronum> newNode.heronum) //找到位置节点,在节点之前的位置插入就可,和单链表相似就是没想出来
{
newNode.next=temp.next;
temp.next.pre=newNode;
temp.next=newNode;
newNode.pre=temp;
flag=true;
}
if(temp.heronum==newNode.heronum)
{
System.out.print("节点已经存在,不可插入\n");
}
temp=temp.next;
if(flag)
return;
}
}
//测试一下是否是双链表,测试成功,可以找到前一个节点
public void findforwardnode(int number)
{
HeroNode2 temp = head.next;
while(temp!=null)
{
if(temp.heronum==number)
{
System.out.print("前一个节点为");
System.out.println(temp.pre);
return ;
}
temp=temp.next;
}
System.out.print("找不到对应的节点\n");
}
//遍历链表
public void travel() {
if (head.next == null) {
System.out.print("链表为空\n");
return;
}
else {
HeroNode2 temp = head.next;
while (temp != null) {
System.out.println(temp);
temp = temp.next;
}
}
}
//按照编号删除节点,测试成功
public void delete(int number)
{
HeroNode2 temp=head;
boolean flag=false;
while(temp!=null)
{
if(temp.heronum==number)
{
if(temp.next==null) //最后一个节点比较特殊
temp.pre.next=temp.next;
else
{
temp.pre.next=temp.next;
temp.next.pre=temp.pre;
}
flag=true;
}
temp=temp.next;
if(flag)
return ;
}
System.out.print("删除节点编号不存在\n");
return ;
}
//按序号更新信息,和删除类似,编号不能更改
public void update(HeroNode2 newNode)
{
HeroNode2 temp = head.next;
while(true)
{
if(temp==null)
{
System.out.print("待更新的节点找不到\n");
return ;
}
if(temp.heronum==newNode.heronum)
{
temp.heroname=newNode.heroname;
temp.heroNickName=newNode.heroNickName;
return;
}
temp=temp.next;
}
}
}
//定义双链表节点结构
class HeroNode2{
int heronum;
String heroname;
String heroNickName;
HeroNode2 next;
HeroNode2 pre;
public HeroNode2(int heronum,String heroname,String hreoNickName)
{
this.heronum=heronum;
this.heroname=heroname;
this.heroNickName=hreoNickName;
}
@Override
public String toString() {
return " [heronum=" + heronum + ", heroname=" + heroname + ", heroNickName=" + heroNickName + "]";
}
}