双向链表
思路:
- 遍历和单链表一样,只是可以向前或向后遍历。
- 添加默认添加到链表末尾
(1)、先找到最后一个节点;
(2)、temp.next = newHearNode;
(3)、newHearNode.pre = temp; - 修改和单向链表一样
- 删除节点
(1)、双向链表可以自我 删除,只需要找到待删除节点;
(2)、temp.pre.next = temp.next
(3)、temp.next.pre = temp.pre
代码实现
//创建一个双向链表的类
class DoubleLinkList{
//先初始化一个头结点(head),头结点不能动,不存放具体数据
private HearNode2 head = new HearNode2(0,"","");
public HearNode2 getHead() {
return head;
}
//添加,添加数据到末尾
public void add(HearNode2 hearNode) {
//head不能动,需要一个辅助遍历temp
HearNode2 temp = head;
//遍历链表,找到最后
while (true) {
//当next为null,则为最后节点
if (temp.next == null){
break;
}
//未找到,就将temp后移
temp = temp.next;
}
//当退出while循坏时,则找到链表最后
//形成双向链表
temp.next = hearNode; //指向下一个节点
hearNode.pre = temp; //指向上一个节点
}
//修改双向链表,和单向链表方式一样,只是节点类型改变
//根据newHearNode的no修改
public void update(HearNode2 newHearNode){
//判断是否为空
if (head.next == null) {
System.out.println("链表为空");
return;
}
//找到需要修改的节点,根据no编号
HearNode2 temp = head.next;
boolean flag = false; //表示是否找到该节点
while (true) {
if (temp == null) {
break; //链表遍历结束
}
if (temp.no == newHearNode.no) { //找到节点
flag = true;
break;
}
temp = temp.next;
}
if (flag) {
//根据flag是否找到需要修改的节点
temp.name = newHearNode.name;
temp.nickName = newHearNode.nickName;
}else {
//未找到节点
System.out.println("未找到no为" + newHearNode.no + "节点");
}
}
//删除双向链表节点
//1、先找到需要删除的这个节点temp
//2、temp的上一个节点指向temp的下一个节点,temp的下一个节点指向上一个节点
//3、被删除的节点将不会有其它引用指向,则会被垃圾回收机制回收
public void delete(int no) {
//判断链表是否为空
if (head.next == null) {
System.out.println("链表为空,无法删除");
return;
}
HearNode2 temp = head.next;
boolean flag = false; //标识是否找到待删除的节点的前一个节点
while (true) {
if (temp == null) { //已经到链表最后
break;
}
if (temp.no == no) {
flag = true; //找到待删除节点的前一个节点
break;
}
temp = temp.next;
}
if (flag) {
//找到待删除节
temp.pre.next = temp.next;
if (temp.next != null) {
temp.next.pre = temp.pre;
}
}else {
System.out.println("需要被删除的节点no:" + no + "不存在");
}
}
//遍历双向链表
//显示链表
public void list() {
//先判断链表是否为空
if (head.next == null) {
System.out.println("链表为空");
return;
}
//因为头节点不能动,因此我们需要一个临时temp来遍历
HearNode2 temp = head.next;
while (true) {
//判断是否到链表最后
if (temp == null) {
break;
}
//输出节点信息
System.out.println(temp);
//将next后移
temp = temp.next;
}
}
}
//定义一个hearNode,每个hearNode对象就是一个节点
class HearNode2{
public int no;
public String name;
public String nickName;
public HearNode2 next; //下一个节点,默认为null
public HearNode2 pre; //指向前一个节点,默认为null
public HearNode2(int no,String name,String nickName) {
this.no = no;
this.name = name;
this.nickName = nickName;
}
@Override
public String toString() {
return "HearNode{" +
"no=" + no +
", name='" + name + '\'' +
", nickName='" + nickName + '\'' +
'}';
}
}
测试验证
public class DoubleLinkListDemo {
public static void main(String[] args) {
//测试
HearNode2 hearNode1 = new HearNode2(1,"松江","及时雨");
HearNode2 hearNode2 = new HearNode2(2,"卢俊义","玉麒麟");
HearNode2 hearNode3 = new HearNode2(3,"吴勇","智多星");
HearNode2 hearNode4 = new HearNode2(4,"林冲","豹子头");
//创建双向链表
DoubleLinkList doubleLinkList = new DoubleLinkList();
doubleLinkList.add(hearNode1);
doubleLinkList.add(hearNode2);
doubleLinkList.add(hearNode3);
doubleLinkList.add(hearNode4);
System.out.println("显示链表");
doubleLinkList.list();
//修改链表
doubleLinkList.update(new HearNode2(4,"公孙胜","入云龙"));
System.out.println("修改后的链表");
doubleLinkList.list();
//删除节点
doubleLinkList.delete(1);
System.out.println("删除后的链表");
doubleLinkList.list();
}
}