四.链表
1.链表的基本实现
头插法实现:
头节点:
public class Link {
public int iData;
public double dData;
public Link next;
public Link(int i, double d) {
this.iData = i;
this.dData = d;
}
public void displayLink() {
System.out.print("{" + iData + "," + dData + "}");
}
}
链表:
publicclass LinkList {
private Link frist;
public LinkList() {
frist = null;
}
publicboolean isEmpty() {
returnfrist == null;
}
publicvoid insertFrist(int i, double d) {
Link newLink = new Link(i, d);
newLink.next = this.frist;
frist = newLink;
}
public Link deleteFrist() {
Link temp = frist;
frist = frist.next;
return temp;
}
publicvoid displayLink() {
System.out.println("frist->last :");
Link current = frist;
while (current != null) {
current.displayLink();
current = current.next;
}
System.out.println("");
}
}
从上面的代码中不难发现链表的数据的插入和删除是从头节点进行的;
2.链表的查找和删除:
public Linkfind(int key) {
Link current = frist;
while (current.iData != key) {
if (current.next == null) {
returnnull;
} else {
current = current.next;
}
}
return current;
}
public Linkdelete(int key) {
Link current = frist;
Link previous = frist;
while (current.iData != key) {
if (current.next == null) {
returnnull;
} else {
previous = current;
current = current.next;
}
}
if (current == frist) {
frist = frist.next;
}
previous.next = current.next;
return current;
}
3.注意在进行查找时需要一个引用变量,在进行删除时要使用两个引用变量。
4.链表的效率:头插法进行的插入和删除操作的时间复杂度为O(1);另外重要的是链表的大小是可变的;
5.使用链表实现栈,链栈的实现:
publicclass LinkStack {
private LinkList linkList;
public LinkStack() {
linkList = new LinkList();
}
publicvoid push(long value) {
linkList.insertFrist(0, value);
}
public Link pop() {
returnlinkList.deleteFrist();
}
publicboolean isEmpty() {
returnlinkList.isEmpty();
}
publicvoid displayStack() {
linkList.displayLink();
}
}
链栈的实现是基于链表的头插法进行的,所以相对比较简单;正是因为链表头插法在链表的一端进行正符合栈的特性;
6.同样也可以利用双端链表实现队列;
7.有序链表的实现:
publicclass SortedList {
private Link frist;
public SortedList() {
frist = null;
}
publicboolean isEmpty() {
returnfrist == null;
}
publicvoid insert(long value) {
Link newLink = new Link(0, value);
Link previous = null;
Link current = frist;
while (current != null && value > current.dData) {
previous = current;
current = current.next;
}
if (previous == null) {
frist = newLink;
} else {
previous.next = newLink;
}
newLink.next = current;
}
public Link remove() {
Link temp = frist;
frist = frist.next;
return temp;
}
publicvoid display() {
System.out.println("frist->last :");
Link current = frist;
while (current != null) {
current.displayLink();
current = current.next;
}
System.out.println("");
}
}
通过插入有序进行设计有序链表,删除时从链表的头部进行;