在实现了单链表的增删改查的基本操作之后,我们能发现单向链表只能从头节点开始向后查找,不能从后向前查找;在实现删除节点功能是发现,单链表不能自我删除,每次删除某个节点都要找到要删除节点的前一个节点temp作为辅助节点,才能完成删除。
对于双向链表来说,既可以从前往后查找,又可以从后往前查找;删除节点时可以自我删除,不需要借助辅助节点(temp.next=temp.next.next完成自我删除)。下面对双向链表的增删改查操作用代码实现:
public class DoubleLinkedList {Node head = new Node(0,"");//遍历链表(从前往后)public void show(){if (head.next == null){System.out.println("链表中还没有节点哦,快去添加吧!");}Node temp = head.next;while (temp != null){System.out.println(temp);temp = temp.next;}}//添加节点(添加到末尾)public void add(Node newNode){Node temp = head;while (temp.next != null){temp = temp.next;}temp.next = newNode;newNode.pre = temp;}//添加节点(按顺序添加)public void addByOrder(Node newNode){Node temp = head;boolean flag = false;while (true){if (temp.next == null){//相当于在末尾添加break;}if (temp.next.no > newNode.no){//在特定位置添加break;}else if (temp.next.no == newNode.no){//不能添加flag = true;break;}temp = temp.next;}if (flag){System.out.printf("链表中已有编号为%d的节点,无法插入",newNode.no);return;}if (temp.next == null){temp.next = newNode;newNode.pre = temp;}else {newNode.pre = temp;newNode.next = temp.next;temp.next.pre = newNode;temp.next = newNode;}}//修改节点public void updata(Node newNode){if (head.next == null){System.out.println("链表为空,无法修改");return;}boolean flag = false;Node temp = head.next;while (true){if (temp == null){//没有找到要修改的节点break;}if (temp.no == newNode.no){flag = true;break;}temp = temp.next;}if (flag){temp.name = newNode.name;}else {System.out.println("没有找到要修改的节点,修改失败");}}//删除节点public void del(int no){if (head.next == null){System.out.println("链表为空,无法删除");return;}boolean flag = false;Node temp = head.next;while (temp != null){if (temp.no == no){flag = true;break;}temp = temp.next;}if (flag){//找到了,删除,temp就是temp.pre.next = temp.next;if (temp.next != null){//需要删除的节点不是最后一个节点temp.next.pre = temp.pre;}}else {System.out.println("没有找到要删除的节点,删除失败");}}
}