java实现双向链表的功能(简单版)
本次代码实现双向链表的几个基本功能,其他更多我将在后续用c语言实现,如果感兴趣,可以看一下我上一篇文章单链表的功能实现,俩者其实算法类似,可以互相带入理解一下。附上链接[单链表]。(https://blog.csdn.net/weixin_44720403/article/details/102533697)
功能
1.添加结点
2.遍历结点
3.更新结点
4.删除结点
详细注释代码来啦!!!
package linkedlist;
public class DoubleLinkedListDemo {
public static void main(String[] args) {
// TODO Auto-generated method stub
HeroNode2 hero1 = new HeroNode2(1, "宋江", "及时雨");
HeroNode2 hero2 = new HeroNode2(2, "卢俊义", "玉麒麟");
HeroNode2 hero3 = new HeroNode2(3, "吴用", "智多星");
HeroNode2 hero4 = new HeroNode2(4, "林冲", "豹子头");
HeroNode2 hero5 = new HeroNode2(5, "武松", "打虎哥");
DoubleLinkedList doubleLinkedList = new DoubleLinkedList();
doubleLinkedList.add(hero1);
doubleLinkedList.add(hero2);
doubleLinkedList.add(hero3);
doubleLinkedList.add(hero4);
doubleLinkedList.add(hero5);
System.out.println("添加后结点链表为:");
doubleLinkedList.list();
System.out.println("修改后结点链表为:");
HeroNode2 hero6 = new HeroNode2(5, "武松", "*武二郎*");
doubleLinkedList.update(hero6);
doubleLinkedList.list();
//删除
System.out.println("删除结点的链表为:");
doubleLinkedList.delete(3);
doubleLinkedList.list();
}
}
//创建一个双向链表类
class DoubleLinkedList{
//先初始化一个头结点
private HeroNode2 head = new HeroNode2(0,"","");
public HeroNode2 gethead() {
return head;
}
//添加节点到双向链表
//思路:当不考虑编号的顺序时
//1.找到当前链表的最后节点,2.将最后节点next指向新节点 新节点pre指向最后节点
public void add(HeroNode2 heroNode) {
HeroNode2 temp = head;
while(true) {
if(temp.next ==null) {
break;//temp到了最后的结点
}
//temp后移
temp = temp.next;
}
//连接到最后的节点上
temp.next = heroNode;
heroNode.pre = temp;
}
//修改结点信息
public void update(HeroNode2 heroNode) {
if(head.next == null) {
System.out.println("链表为空!!");
return;
}
HeroNode2 temp = head.next;
while(true) {
if(temp == null) {
System.out.printf("没有找到编号为%d的结点!!\n",heroNode.no);
break;//已近遍历完毕 到最后节点的next空域
}
if(temp.no == heroNode.no) {
temp.name = heroNode.name;
temp.nickname = heroNode.nickname;
break;
}
temp = temp.next;
}
}
//删除结点
public void delete(int no) {
if(head.next==null) {
System.out.println("链表为空!!");
return;
}
HeroNode2 temp = head.next;
boolean flag = false;
while(true) {
if(temp.next == null) {
break;
}
if(temp.no==no) {
flag = true;
break;
}
temp = temp.next;
}
if(flag) {
temp.pre.next=temp.next;
//如果是最后一个节点,不需要这句语句,否者出现
// 空指针异常!!null = temp.pre;
if(temp.next!=null) {//不是最后一个节点才执行
temp.next.pre =temp.pre;
}
}else {
System.out.printf("没找到%d号结点!!",no);
}
}
//遍历双向链表
public void list() {
if(head.next ==null) {
System.out.println("链表为空!!");
return;
}
HeroNode2 temp = head.next;
while(true) {
if(temp==null) {
break;
}
System.out.println(temp);
temp = temp.next;
}
}
}
//定义一个HeroNode,每个HeroNode对象都是一个节点
class HeroNode2{
public int no ;
public String name;
public String nickname;
public HeroNode2 next;
public HeroNode2 pre;
//构造器
public HeroNode2(int no,String name,String nickname) {
this.no = no;
this.name = name;
this.nickname =nickname;
}
//注意!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
//为了显示方便,我们重新toString()
public String toString() {
return "HeroNode [no = " + no+ ",name="+name+",nickname="+nickname+"]";
}
}