双向链表:一个节点中既有上一个节点的内存地址又有下一个节点的内存地址,还有数据域
实现双向链表的增删改查:
首先:我们需要一个节点类来展示节点信息:
class HNode{
public String name;
public int no;//根据这个编号来查找,修改,删除,添加元素
public HNode next;//下一个节点的信息
public HNode pre;//上一个节点的信息
public HNode(String name, int no) {
this.name = name;
this.no = no;
}
@Override
public String toString() {
return "姓名" +
name + '\'' +
"编号" + no
;
}
}
接下来创建一个双向链表类来实现增删改查
class TwoWayLinkedList{
HNode head=new HNode("",0);//定义一个空的头结点
接下来就是增删改操作了,关于实现的一些细节在代码注释里了
增,直接在末尾添加
public void add(HNode newHNode){
HNode temp=head;//头节点不能移动,用一个temp指针来遍历双向链表
while(true)
{
if(temp.next==null)//找到了最后
{
break;
}
temp=temp.next;
}
temp.next=newHNode;//最后一个节点的下一个节点就是新加的节点
newHNode.pre=temp;//新的节点的前一个节点就是temp
}
增,按照no顺序添加
来张图可能更好理解一些
public void addByNo(HNode newHNode){
HNode temp=head;
boolean flag=false;//判断条件
while(true)
{
if(temp.next==null)
{
break;
}
if(newHNode.no<temp.next.no)//找到位置了
{
break;
}
if(newHNode.no==temp.next.no)
{
flag=true;//如果编号重复就标记一下
break;
}
temp=temp.next;
}
if(flag)
{ System.out.println("编号重复,添加失败~~");
}
else{
newHNode.next=temp.next;//新节点的下一个节点为temp的下一个节点
temp.next=newHNode;//temp的下一个节点为新的节点,相当于中间插入了一个节点
}
}
删
//修改元素,通过no定位
public void modify(int no,String name){
HNode temp=head;
boolean flag=false;
if(temp.nextnull)
{
System.out.println(“链表已空修改失败”);
return;
}
while(true)
{
if(temp.nono)
{
break;
}
if(temp.next==null){
flag=true;
break;
}
temp=temp.next;
}
if(flag){
System.out.println(“没有找到要修改的元素呢”);
}
else {
temp.name=name;
}
}
显示
//显示元素
public void show(){
HNode temp=head;
if(head.next==null)
{
System.out.println("链表为空!");
return ;
}
while(true)
{
if(temp.next==null)
{
break;
}
System.out.println(temp.next);
temp=temp.next;
}
}
//从尾到头遍历
public void showByReverse(){
HNode temp=head;
HNode temp2;
while(true)
{
if(temp.next==null)
{
temp2=temp;
break;
}
temp=temp.next;
}
while(true)
{
if(temp2.pre==null)
{
break;
}
System.out.println(temp2);
temp2=temp2.pre;
}
}
测试截图