java的双向链表的使用
package 链表.双向链表;
public class Twoway_linked_list {
public static void main(String[] args) {
System.out.println("双向链表的测试");
HerNode2 herNode1=new HerNode2(6,"宋江","及时雨");
HerNode2 herNode3=new HerNode2(2,"鲁之深","倒");
HerNode2 herNode4=new HerNode2(3,"张飞","大胡子");
HerNode2 herNode5=new HerNode2(4,"吴用","智多星");
HerNode2 herNode6=new HerNode2(3,"曹操","说到就到");
HerNode2 herNode7=new HerNode2(1,"曹操","说到就到");
DoubleHerNOdelist doubleHerNOdelist=new DoubleHerNOdelist();
doubleHerNOdelist.AddHerNode(herNode1);
doubleHerNOdelist.AddHerNode(herNode3);
doubleHerNOdelist.AddHerNode(herNode4);
doubleHerNOdelist.AddHerNode(herNode5);
doubleHerNOdelist.ShowHerNodeList();
/* doubleHerNOdelist.XuoGaiLiangBiao(herNode6);
doubleHerNOdelist.ShowHerNodeList();
doubleHerNOdelist.Shangchuijeidian(4);
doubleHerNOdelist.ShowHerNodeList();*/
doubleHerNOdelist.TanJianHerNode(herNode7);
doubleHerNOdelist.ShowHerNodeList();
}
}
//相对单链表会多个指针,一个尾指针,一个正向指针
/*temp.next=NewHerNOde;
* NewHerNode.prep=temp*/
//创建链表
class DoubleHerNOdelist{
//创建头节点
private HerNode2 herNode2=new HerNode2(0,"","");
//返回头节点
public HerNode2 GetHerNode(){
return herNode2;
}
//显示节点,遍历整个链表
public void ShowHerNodeList(){
//判断链表是否为空,
if(herNode2.next==null){
System.out.println("链表为为空……");
}
//因为头节点不能动所以的用一个变量进行遍历
HerNode2 temp=herNode2.next;
while (temp!=null){//不能是temp.next!=null,这样就会只循环到倒数第二个节点就会终止运行
System.out.println(temp);
temp=temp.next;//节点后移
}
System.out.println();
}
//添加节点
public void AddHerNode(HerNode2 herNode1){
//因为头节点不能动所以用一个临时变量进行遍历,
//遍历是为了找到节点为好添加下一个节点
HerNode2 temp=herNode2;//用一个temp(指针)指向第一个头节点
//遍历整个链表找到最后
while(temp.next!=null){
temp=temp.next;
}
temp.next=herNode1;//指针是至指向下一个节点的,最后一个指针的next==null;、
herNode1.pre=temp;//指针是指向上一个节点的
}
//按照顺序添加节点,按照单链表一样进行添加
public void TanJianHerNode(HerNode2 herNode){
boolean flag=false;
boolean flag1=false;
//先进行判断链表是否为空
if (herNode2.next==null){
System.out.println("链表为空……");
return;
}
HerNode2 temp=herNode2;//引用辅助指针进行遍历
while(true){
if (temp.next==null){
break;
}
if (temp.next.no>herNode.no){//已经找到位置跳出循环,并记录位置
flag1=true;
break;
}
if (temp.no==herNode.no){
flag=true;
break;
}
temp=temp.next;
}
if (flag){
System.out.println("添加的节点"+herNode.no+"已经存在不能添加");
} if (flag1) {
if (temp.next == null) {
temp.next = herNode;
herNode.next = temp.next;
} else {
/* temp.next = herNode;//这样写就没有进行先拆分,是错误的
herNode.next = temp.next;*/
herNode.next=temp.next;//先得拆开以前的链接,然后引入下一个节点,不然会然temp会有俩个连接,会发生错误不能运行
temp.next=herNode;
herNode.pre = temp;
temp.next.pre = herNode;
System.out.println("添加节点信息完成" + herNode);
}
}
}
//修改双向链表的的泛泛和单链表一样只是链表类型不一样
public void XuoGaiLiangBiao(HerNode2 herNode){
boolean flag=false;
if (herNode2.next==null){
System.out.println("链表为空……");
return;
}
HerNode2 temp=herNode2.next;
while (true){
if (temp==null){
System.out.println("已经查找到链表为并未能找到节点");
break;
}
if (herNode.no==temp.no){
flag=true;
break;
}
temp=temp.next;
}
if (flag){
temp.name=herNode.name;
temp.anthername=herNode.anthername;
System.out.println("修改完成……");
System.out.println("修改信息如下");
System.out.println(temp);
}
}
//删除节点
//对于双向链表来说删除并不需要找到上一个节点,直接找到当前近节点
//然后直接修改指针
public void Shangchuijeidian(int no){
boolean flag=false;
if(herNode2.next==null){
System.out.println("链表为空……");
return;
}
HerNode2 temp=herNode2.next;
while (true){
if (temp==null){
System.out.println("已经查到链表并未查到……");
break;
}
if (no==temp.no){
flag=true;
break;
}
temp=temp.next;
}
if (flag) {
//都是箭头的尾被赋值
if (temp.next == null) {
temp.pre.next = null;//节点上一个节点指向下一个节点方向是想向下的——》
} else {
temp.pre.next = temp.next;//节点上一个节点指向下一个节点方向是想向下的——》
//如果是最后一个节点则没有下一个节点,不考虑容易产生空指针异常
temp.next.pre = temp.pre;//节点的下一个节点的向上的指针指向temp节点的上一个节点方向为《——
System.out.println("删除完成……");
}
}
}
}
//节点就是一个类的对象
//创建一个节点,每一个节点就是一个对象
class HerNode2{
public int no;
public String name;
public String anthername;
public HerNode2 next;//指向下一个节点
public HerNode2 pre;//指向上一个节点
public HerNode2(int no, String name, String anthername ) {
this.no = no;
this.name = name;
this.anthername = anthername;
}
//为了显示明显从写Tostring方法
@Override
public String toString() {
return "HerNode{" +
"no=" + no +
", name='" + name + '\'' +
", anthername='" + anthername + '\'';
}
}
测试代码块
双向链表的测试
HerNode{no=6, name=‘宋江’, anthername=‘及时雨’
HerNode{no=2, name=‘鲁之深’, anthername=‘倒’
HerNode{no=3, name=‘张飞’, anthername=‘大胡子’
HerNode{no=4, name=‘吴用’, anthername=‘智多星’
添加节点信息完成HerNode{no=1, name=‘曹操’, anthername=‘说到就到’
HerNode{no=1, name=‘曹操’, anthername=‘说到就到’
HerNode{no=6, name=‘宋江’, anthername=‘及时雨’
HerNode{no=2, name=‘鲁之深’, anthername=‘倒’
HerNode{no=3, name=‘张飞’, anthername=‘大胡子’
HerNode{no=4, name=‘吴用’, anthername=‘智多星’
进程已结束,退出代码0