Day13——Linked List
1. Background
今天是学习java的第十三天了,今天学习的内容是链表。
链表作为数据结构的一种,功能和具体构造是在昨天的顺序表的基础上增加了许多。
2. Description
2.1Linked List
链表(LinkedList)顾名思义就是由一个一个的节点(Node)连成的链,构成的表。
一般有一个头节点,然后其余的节点一个接着一个排在后面。有头节点是为了方便操作,如果不想带头节点也可以。
在链表中弱化了顺序,只有节点之间连接的"链"(next)才由一个节点能找到下家。由于这样只能一个一个顺藤摸瓜的找数据,查找效率非常慢,所以人们也提出了双链表、循环链表这些来方便操作。
如下图,展示了链表的结构。每一个蓝色方格代表节点,其中都存有数据。节点之间的练习仅由next这个箭头链接。
2.2 Insert
作为数据结构中的经典操作——增删改查中的“增”这个操作,作用就是在链表中的特定位置增加给定值。
这个操作的逻辑是,先遍历链表,使tempNode
遍历到我们要增加的地方的前一个节点,然后让tempNode
的next指针指向tempNewNode
,再把tempNewNode
的next指针指向tempNode
的next指针原本指向的地方。如下图:
2.3Delete
删除操作和增加操作同理,也是先遍历再删除。
不过需要注意的是,我们删除时使用的逻辑是让tempNode
的next指针,不指向原来指向的节点,而是指向原来指向的节点的next指针指向的节点,也就是指向tempNode节点的下下节点。这样,在链表中tempNode本来的下一个节点就可被视为删除。具体操作如下图:
注:在C语言中进行上述操作之后需要对被删除节点进行free()
操作,不然这个节点虽然在链表中被删除了,但是一直存在于内存空间中,造成资源的浪费。而在java中则不需要这个操作,因为java由垃圾回收这个机制。
3.Code
package datastructure;
/**
* Linked list.
*
* @author Leo Liu lyx1443807042@qq.com
*/
public class LinkedList {
/**
* An inner class.
*/
class Node {
/**
* The data.
*/
int data;
/**
* The reference to the next node.
*/
Node next;
/**
**************
* The structure. The data.
* @param paraValue
**************
*/
public Node(int paraValue) {
data = paraValue;
next = null;
} // Of Node
} // Of class Node
Node header;
/**
**************
* Construct an empty linked list.
**************
*/
public LinkedList() {
header = new Node(0);
} // Of LinkedList
public String toString() {
String resultString = "";
if (header.next == null) {
return "empty";
}
Node tempNode = header.next;
while (tempNode != null) {
resultString += tempNode.data + ", ";
tempNode = tempNode.next;
} // Of while
return resultString;
} // Of toString
public void reset() {
header.next = null;
} // Of reset
/**
**************
* 查找给定值在链表中的位置,如果出现多个,则返回第一个。
* @param paraValue The given value.
* @return The position -1 or not found.
**************
*/
public int Locate(int paraValue) {
int tempPosition = -1;
int tempCountPosition = 0;
Node tempNode = header.next;
while (tempNode != null) {
if (paraValue == tempNode.data) {
tempPosition = tempCountPosition;
break;
} // Of if
tempCountPosition++;
tempNode = tempNode.next;
} // Of while
return tempPosition;
} // Of Locate
/**
**************
* 增删改查中的增加操作
* @param paraPosition The given position.
* @param paraValue The given value.
* @return Success or not.
**************
*/
public boolean Insert(int paraPosition, int paraValue) {
Node tempNode = header;
Node tempNewNode = new Node(paraValue);
for (int i = 0; i < paraPosition; i++) {
if (tempNode.next == null) {
System.out.println("The position " + paraPosition + " is out of bound.");
return false;
} // Of if
tempNode = tempNode.next;
} // Of for i
// Link node.
tempNewNode.next = tempNode.next;
tempNode.next = tempNewNode;
return true;
} // Of Insert
/**
**************
* 增删改查中的删除操作。
* @param paraPosition The given position.
* @return Success or not.
*/
public boolean Delete(int paraPosition) {
Node tempNode = header;
if (tempNode.next == null) {
System.out.println("Cannot delete element form an empoty list.");
return false;
} // Of if
for (int i = 0; i < paraPosition; i++) {
if (tempNode.next.next == null) {
System.out.println("The position " + paraPosition + "is out of bound.");
return false;
} // Of if
tempNode = tempNode.next;
} // Of for i
tempNode.next = tempNode.next.next;
return true;
} // Of Delete
public static void main(String[] args) {
LinkedList tempFirstList = new LinkedList();
System.out.println("Initialized, the list is: " + tempFirstList.toString());
for (int i = 0; i < 5; i++) {
tempFirstList.Insert(0, i);
} // Of for i
System.out.println("Inserted, the list is: " + tempFirstList.toString());
System.out.println("The list is: " + tempFirstList);
tempFirstList.Insert(6, 9);
tempFirstList.Delete(4);
tempFirstList.Delete(2);
System.out.println("Deleted, the list is: " + tempFirstList.toString());
tempFirstList.Delete(0);
System.out.println("Deleted, the list is: " + tempFirstList.toString());
for (int i = 0; i < 5; i++) {
tempFirstList.Delete(0);
System.out.println("Looped delete, the list is: " + tempFirstList.toString());
} // Of for i
}
}
运行结果:
运行结果: