链表
链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针实现的。链表由一系列结点组成,结点可以在运行时动态生成,而且由于没有闲置的内存,因此空间效率比数组高。其插入操作可达到O(1)复杂度,但是查找或者访问特定的结点复杂度是O(n)。
一、链表优点:
-
空间没有限制
-
插入删除元素很快
二、链表缺点:存取速度很慢
三、链表又分了好几类:
1、单向链表:一个节点指向下一个节点
2、双向链表:一个节点有两个指针域
3、循环链表能通过任何一个节点找到其他所有的节点,将两种(双向/单向)链表的最后一个结点指向第一个结点从而实现循环
四、Java实现链表
算法:
-
遍历
-
查找
-
清空
-
销毁
-
求长度
-
排序
-
删除节点
-
插入节点
1、首先定义节点类:
public class LinearNode {
private LinearNode next; //用于指向下一个节点
private Object element;
//创建一个空节点
public LinearNode() {
next = null;
element = null;
}
//创建一个给定元素的节点
public LinearNode(Object element) {
next = null;
this.element = element;
}
public LinearNode getNext() {
return next;
}
public void setNext(LinearNode next) {
this.next = next;
}
public Object getElement() {
return element;
}
public void setElement(Object element) {
this.element = element;
}
@Override
public String toString() {
return "{" +
"'" + element +
"'}";
}
}
2、定义链表类实现增、删
public class LinkedBag {
private int count; //记录当前节点在链表中的编号
private LinearNode contents; //链表中的元素
public LinkedBag() {
count = 0;
contents = null;
}
public int getCount() {
return count;
}
public LinearNode getContents() {
return contents;
}
//给链表中添加节点
public void add(Object element){
LinearNode node = new LinearNode(element);
node.setNext(contents);
contents = node;
count++;
}
//删除链表中的给定的节点
public Object remove(Object target){
boolean found = false;
LinearNode previous,current;
Object result = null;
if(contents.getElement().equals(target)){
result = contents.getElement();
contents = contents.getNext();
}else{
previous = contents;
current = contents.getNext();
for(int look=1;look<count&&!found;look++) {
if (current.getElement().equals(target)) {
found = true;
} else {
previous = current;
current = current.getNext();
}
if (!found) {
throw new NoSuchElementException();
}
result = current.getElement();
previous.setNext(current.getNext());
}
}
count--;
return result;
}
//遍历节点
public void next(LinkedBag bag)
{
LinearNode current = bag.getContents();
while(current != null){
System.out.print("--->"+current.getElement());
current = current.getNext();
}
}
}