此文章仅作为自己学习过程中的记录和总结,同时会有意地去用英文来做笔记,一些术语的英译不太准确,内容如有错漏也请多指教,谢谢!
一、双向链表-概述
-双向链表的基本组成结构:
- Node:自定义的结点结构。
- (Node) head:指向单链表头结点的“头指针”。
-自定义结点的基本组成结构:
- 数据域:存放具有实际意义的数据。
- “指针”域(next):存放一个指向下一结点的“指针”。
- “指针”域(pre):存放一个指向上一结点的“指针”。【与单链表的区别】
-优点:
- 遍历方向:单链表只能朝向一个方向遍历查找;而双向链表可以朝两个方向遍历查找。
- 结点的自我删除:单链表在进行删除操作时,无法实现自我删除,因此代码实现中我们都是通过遍历到目标结点的前一个结点时停下;而双向链表在进行删除操作时,可以实现自我删除。
-内容:
- 构造方法。
- add()【向链表中添加结点】
- addByOrder()【向链表中按顺序(默认升序)添加结点】
- update()【更新链表中已存在的某个结点的信息】
- delete()【删除链表中已存在的的某个结点】
- show()【打印出链表中所有元素的内容】
(关于单链表的属性、构造器、结点结构及基本方法,具体可见:数据结构与算法–单链表(Single Linked List))
(单链表相关的企业面试题,具体可见:数据结构与算法–单链表相关面试题)
二、双向链表-代码实现
- Custom Node(自定义结点结构)
/*
HeroNode2
Zzay
2021/01/20
*/
package com.zzay.linkedlist.impl;
/**
* Define the node of the double linked list.
*
* @author Zzay
* @version 2021/01/20
*/
public class HeroNode2 {
private int no;
private String name;
private String nickname;
protected HeroNode2 next;
protected HeroNode2 pre; // The difference from single linked list
public HeroNode2(int hNo, String hName, String hNickname) {
no = hNo;
name = hName;
nickname = hNickname;
next = null;
pre = null;
}
@Override
public String toString() {
return "HeroNode1 [" +
"number=" + no +
", name='" + name + '\'' +
", nickname='" + nickname + '\'' +
']';
}
public int getNo() {
return no;
}
public String getName() {
return name;
}
public String getNickname() {
return nickname;
}
public void setName(String name) {
this.name = name;
}
public void setNickname(String nickname) {
this.nickname = nickname;
}
}
- Attributes and constructor
/*
DoubleLinkedList
Zzay
2021/01/20
*/
package com.zzay.linkedlist.impl;
/**
* The implementations of a double linked list.
* <p>
* CONTENTS:
* (1) Add nodes.
* (2) Update a node's information.
* (3) Delete a node from the single linked list. (注意空指针)
* (4) Show the contents of the single linked list.
*
* @author Zzay
* @version 2021/01/20
*/
public class DoubleLinkedList {
// The head node of the double linked list. It does not store any practical data.
private HeroNode2 head = new HeroNode2(0, "", "");
/**
* Instantiate a double linked list without giving any nodes.
*/
public DoubleLinkedList() {
}
/**
* Instantiate a double linked list with a given head node.
*
* @param head The given head node
*/
public DoubleLinkedList(HeroNode2 head) {
this.head = head;
}
}
- Methods
/**
* Add new node into the double linked list.
*
* @param newNode The new node to be added
*/
public void add(HeroNode2 newNode) {
HeroNode2 temp = head;
while (temp.next != null) {
// When the list gets to the end.
temp = temp.next;
}
temp.next = newNode;
newNode.pre = temp;