1、双向链表添加了前指针pre
2、对双链表进行操作时,定位到该指针(单链表需要定位在前一个)
3、当下一个为空时,该如何进行挂载结点
/* 双向链表
*/
public class DoubleLink {
public static void main(String[] args) {
LinkAchieve l = new LinkAchieve();
DoubleLinkDemo d1 = new DoubleLinkDemo(1, "李东");
DoubleLinkDemo d2 = new DoubleLinkDemo(2, "李明");
DoubleLinkDemo d3 = new DoubleLinkDemo(3, "李红");
DoubleLinkDemo d4 = new DoubleLinkDemo(4, "李芳");
DoubleLinkDemo d5 = new DoubleLinkDemo(5, "李钱");
l.sortedAdd(d3);
l.sortedAdd(d4);
l.sortedAdd(d1);
l.sortedAdd(d2);
l.headAdd(d5);
l.show();
// 删除结点
l.deletNode(d2);
System.out.println();
l.show();
System.out.println();
//修改结点
l.upDate(5, "李钱~~~");
l.show();
}
}
// 双向链表的实现功能
class LinkAchieve {
private DoubleLinkDemo head = new DoubleLinkDemo(0, "");// 实现头结点
// 尾插法
public void add(DoubleLinkDemo d) {
DoubleLinkDemo temp = head;
// 移动到最后一个
while (true) {
if (temp.next == null) {
break;
}
temp = temp.next;
}
d.next = temp.next;
d.pre = temp;
temp.next = d;
}
// 头插法
public void headAdd(DoubleLinkDemo d) {
DoubleLinkDemo temp = head;
boolean flag = false;
while (true) {
if (temp.next == null) {
break;
}
if (temp.no == d.no) {
flag = true;
break;
}
temp = temp.next;
}
if (flag) {
System.out.println("已有相同结点,无法进行头插法插入元素");
return;
} else {
temp = head;
d.next = temp.next;
// 下一个为空的,另外的操作,否则会出现异常
if (temp.next != null) {
temp.next.pre = d;
}
d.pre = temp;
temp.next = d;
}
}
// 按顺序进行插入
public void sortedAdd(DoubleLinkDemo d) {
DoubleLinkDemo temp = head;
boolean flag = false;
while (true) {
if (temp.next == null) {
d.next = temp.next;
d.pre = temp;
temp.next = d;
break;
}
if (temp.next.no > d.no) {
d.next = temp.next;
temp.next.pre = d;
d.pre = temp;
temp.next = d;
break;
} else if (temp.next.no == d.no) {
flag = true;
break;
}
temp = temp.next; // 后移
}
if (flag) { // 满足条件的进行插入
System.out.println("h" + d.no + "已经存在,无法插入");
}
}
// 修改对应的结点
public void upDate(int no, String data) {
DoubleLinkDemo temp = head;
boolean flag = false;
if (temp.next == null) {
System.out.println("为空链表,无法进行修改指定的值");
return;
}
while (true) {
if (temp == null) {
// 没有该结点
break;
} else if (temp.no == no) {// 定位到该结点
flag = true;
break;
}
temp = temp.next;
}
if (flag) {
temp.data = data;
} else {
System.out.printf("该链表内,不存在序号为:%d 的结点", no);
System.out.println();
}
}
// 删除相应的结点
public void deletNode(DoubleLinkDemo d) {
DoubleLinkDemo temp = head;
boolean flag = false;
if (temp.next == null) {
System.out.println("为空链表,无法进行删除指定的值");
return;
}
while (true) {
if (temp == null) {
// 没有该结点
break;
} else if (temp.no == d.no) {// 定位到该结点
flag = true;
break;
}
temp = temp.next;
}
if (flag) {
if (temp.next != null) {
temp.next.pre = temp.pre;
}
temp.pre.next = temp.next;
} else {
System.out.println("该链表内,不存在相应的结点");
}
}
// 遍历链表
public void show() {
DoubleLinkDemo temp = head;
// 判断是否为空链表
if (temp.next == null) {
System.out.println("此链表为空链表");
return;
}
while (temp.next != null) {
temp = temp.next;
System.out.println(temp.toString());
}
}
}
// 双向链表基本结构
class DoubleLinkDemo {
public int no;
public String data;
public DoubleLinkDemo next;
public DoubleLinkDemo pre;
// 双向链表构造器
public DoubleLinkDemo(int no, String data) {
this.no = no;
this.data = data;
}
@Override
public String toString() {
return "DoubleLinkDemo{" +
"no=" + no +
", data='" + data + '\'' +
'}';
}
}
本文展示了一个Java程序,用于实现双向链表,包括添加前指针,通过前指针对链表进行操作,如按顺序插入、头插法、删除和更新结点。在下一个为空的情况下,程序能正确处理挂载新结点的问题。
4344

被折叠的 条评论
为什么被折叠?



