链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。 相比于线性表顺序结构,操作复杂。由于不必须按顺序存储,链表在插入的时候可以达到O(1)的复杂度,比另一种线性表顺序表快得多,但是查找一个节点或者访问特定编号的节点则需要O(n)的时间,而线性表和顺序表相应的时间复杂度分别是O(logn)和O(1)。
搞清楚什么是链表之后,就可以用Java写一个简单的链表了。我用的是内部类来定义节点,这样的好处是,内部类可以访问外部类的成员和方法。话不多说,贴上代码。
package link;
/**
* @author 曾炜龙 E-mail: 1501122784@qq.com
* @date 创建时间:2017年7月27日 下午5:18:25
* @version 1.0
* @parameter
* @since
* @return
*/
class Link{
class Node{
private String data;
private Node next;
public Node(String data){
this.data = data;
}
//增加操作
public void add(Node node){
if(this.next==null){
this.next=node;
}else{
this.next.add(node);
}
}
//打印
public void print(){
System.out.print(this.data+"\t");
if(this.next!=null){
this.next.print();
}
}
public boolean seach(String data){
if(data.equals(this.data)){
return true;
}else{
if(this.next!=null){
return this.next.seach(data);
}else{
return false;
}
}
}
public void delete(Node per,String data){
if(data.equals(this.data)){
per.next = this.next;
}else{
if(this.next!=null){
this.next.delete(this, data);
}
}
}
};
private Node root;
public void addNode(String data){ //增加节点
Node newNode = new Node(data);
if(this.root==null){
this.root = newNode;
}else{
this.root.add(newNode);
}
}
public void printNode(){
if(this.root!=null){
this.root.print();
}
}
public boolean contains(String data){
return this.root.seach(data);
}
public void deleteNode(String data){
if(this.contains(data)){
if(this.root.data.equals(data)){
this.root = this.root.next;
}else{
this.root.next.delete(root,data);
}
}
}
}
public class LinkDemo2 {
public static void main(String[] args) {
Link l = new Link();
l.addNode("A");
l.addNode("B");
l.addNode("C");
l.addNode("D");
l.addNode("E");
l.addNode("F");
l.printNode();
System.out.println();
System.out.println("----------查询是否存在----------");
boolean b = l.contains("A");
System.out.println(b);
l.deleteNode("A");
System.out.println("-------删除之后------");
l.printNode();
}
}
主要实现的就是基本链表的增删查改方法。