Java知识点——Java链表的常见操作

Java知识点——Java链表的常见操作

参考:java 链表的常见操作

链表是一种数据结构,和数组同级。比如,Java中我们使用的ArrayList,其实现原理是数组。而LinkedList的实现原理就是链表了。链表在进行循环遍历时效率不高,但是插入和删除时优势明显。

1、 定义链表的节点类

class Node {  
    protected Node next; // 下一节点  
    protected String data;// 数据  

    public Node(String data) {  
        this.data = data;  
    }  

    // 显示此节点  
    public void show() {  
        System.out.print(data+"、");  
    }  
}  

2、定义链表类及其操作方法

class LinkList {  
    public Node first; // 定义头结点  
    private int pos = 0;// 节点的位置  

    public LinkList() {  
        this.first = null;  
    }  

    // 插入一个头节点  
    public void addFirstNode(String data) {  
        Node node = new Node(data);  
        node.next = first;  
        first = node;  
    }  

    // 删除一个头结点,并返回头结点  
    public Node deleteFirstNode() {  
        Node tempNode = first;  
        first = tempNode.next;  
        return tempNode;  
    }  

    // 在任意位置插入节点 在index的后面插入  
    public void add(int index, String data) {  
        Node node = new Node(data);  
        Node current = first;  
        Node previous = first;  
        while (pos != index) {  
            previous = current;  
            current = current.next;  
            pos++;  
        }  
        node.next = current;  
        previous.next = node;  
        pos = 0;  
    }  

    // 删除任意位置的节点  
    public Node deleteByPos(int index) {  
        Node current = first;  
        Node previous = first;  
        while (pos != index) {  
            pos++;  
            previous = current;  
            current = current.next;  
        }  
        if (current == first) {  
            first = first.next;  
        } else {  
            pos = 0;  
            previous.next = current.next;  
        }  
        return current;  
    }  

    // 根据节点的data删除节点(仅仅删除第一个)  
    public Node deleteByData(String data) {  
        Node current = first;  
        Node previous = first; // 记住上一个节点  
        while (current.data != data) {  
            if (current.next == null) {  
                return null;  
            }  
            previous = current;  
            current = current.next;  
        }  
        if (current == first) {  
            first = first.next;  
        } else {  
            previous.next = current.next;  
        }  
        return current;  
    }  

    // 显示出所有的节点信息  
    public void displayAllNodes() {  
        Node current = first;  
        while (current != null) {  
            current.show();  
            current = current.next;  
        }  
        System.out.println();  
    }  

    // 根据位置查找节点信息  
    public Node findByPos(int index) {  
        Node current = first;  
        if (pos != index) {  
            current = current.next;  
            pos++;  
        }  
        return current;  
    }  

    // 根据数据查找节点信息  
    public Node findByData(String data) {  
        Node current = first;  
        while (current.data != data) {  
            if (current.next == null)  
                return null;  
            current = current.next;  
        }  
        return current;  
    }  
} 

3、例子:

public class Client {  

    public static void main(String[] args) {  
        LinkList linkList = new LinkList();  
        linkList.addFirstNode("A");  
        linkList.addFirstNode("B");  
        linkList.addFirstNode("C");  
        linkList.add(1, "D");   
        linkList.add(2, "E");  
        linkList.add(3, "F");  
        linkList.displayAllNodes();  
        Node node = linkList.deleteByData("A");  
        System.out.println("node : " + node.data);  
        linkList.displayAllNodes();  
        Node node1 = linkList.findByPos(0);  
        System.out.println("node1: " + node1.data);  
        Node node2 = linkList.findByData("E");  
        System.out.println("node2: " + node2.data);  
    }  
} 

4、结果

CDE、F、B、A、  
node : A  
CDE、F、B、  
node: C  
node: E  
  链表类List的源代码如下: import Java.io.*; public class List {  /*用变量来实现表头*/  private Node Head=null;  private Node Tail=null;  private Node Pointer=null;  private int Length=0;  public void deleteAll()  /*清空整个链表*/  {   Head=null;   Tail=null;   Pointer=null;   Length=0;  }  public void reset()  /*链表复位,使第一个结点成为当前结点*/  {   Pointer=null;  }  public boolean isEmpty()  /*判断链表是否为空*/  {   return(Length==0);  }  public boolean isEnd()  /*判断当前结点是否为最后一个结点*/  {   if(Length==0)    throw new Java.lang.NullPointerException();   else if(Length==1)    return true;   else    return(cursor()==Tail);  }  public Object nextNode()  /*返回当前结点的下一个结点的值,并使其成为当前结点*/  {   if(Length==1)    throw new Java.util.NoSuchElementException();   else if(Length==0)    throw new Java.lang.NullPointerException();   else   {    Node temp=cursor();    Pointer=temp;    if(temp!=Tail)     return(temp.next.data);    else     throw new Java.util.NoSuchElementException();   }  }  public Object currentNode()  /*返回当前结点的值*/  {   Node temp=cursor();   return temp.data;  }     public void insert(Object d)  /*在当前结点前插入一个结点,并使其成为当前结点*/  {   Node e=new Node(d);   if(Length==0)   {    Tail=e;    Head=e;   }   else   {    Node temp=cursor();    e.next=temp;    if(Pointer==null)     Head=e;    else     Pointer.next=e;   }   Length++;  }  public int size()  /*返回链表的大小*/  {   return (Length);  }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值