第 13 天: 链表
链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针(Pointer)。
使用链表结构可以克服数组链表需要预先知道数据大小的缺点,链表结构可以充分利用计算机内存空间,实现灵活的内存动态管理。但是链表失去了数组随机读取的优点,同时链表由于增加了结点的指针域,空间开销比较大。
这一次我们构造的链表是较为基础的链表。先大致将框架给出。
开头是对节点,链表的定义。在node这个类里有node这个类的构造方法。其中各个方法中插入和删除相对来说难度更大,这里做一个分析。
插入:
public boolean insert(int paraPosition, int paraValue) {
Node tempNode = header;
Node tempNewNode;
for (int i = 0; i < paraPosition; i++) {
if (tempNode.next == null) {
System.out.println("The position " + paraPosition + " is illegal.");
return false;
} // Of if
tempNode = tempNode.next;
} // Of for i
// Construct a new node.
tempNewNode = new Node(paraValue);
// Now link them.
tempNewNode.next = tempNode.next;
tempNode.next = tempNewNode;
return true;
}// Of insert
当找到插入位置同时满足插入条件时,进行这两步操作
用图例来进行解释
先1后2,有顺序规定,如果先2后1则会断链,找不到后续若干节点。
删除:
* Delete a value at a position.
*
* @param paraPosition
* The given position.
* @return Success or not.
*********************
*/
public boolean delete(int paraPosition) {
if (header.next == null) {
System.out.println("Cannot delete element from an empty list.");
return false;
} // Of if
Node tempNode = header;
for (int i = 0; i < paraPosition; i++) {
if (tempNode.next.next == null) {
System.out.println("The position " + paraPosition + " is illegal.");
return false;
} // Of if
tempNode = tempNode.next;
} // Of for i
tempNode.next = tempNode.next.next;
return true;
}// Of delete
首先要明确的一点是,你想要删除一个节点,你就必须要有它的前驱节点。如果只有它自己,删除之后前后无法相连。因此会有
对于如何删最后一个节点困惑了很久,因为要删的就是tempNode.next而此时tempNode.next.next == null满足了if语句里面的判断条件应该跳出,结果没注意tempNode从头节点开始,for循环里面的条件 在i=paraPosition跳出循环,循环了paraPosition数值次走到倒数第二个节点,从而可以删除。
最后程序入口以及相应结果如下