1. 程式人生 > 其它 >單鏈表的操作API

單鏈表的操作API

/**
 * 1.1 根據值查詢返回節點 findByValue
 * 1.2 根據角標查詢返回指定的角標的值的節點 findByIndex
 * 2.1 連結串列頭部插入 insertToHead
 * 2.2 連結串列尾部插入 insertTail
 * 3.1 在指定節點的之前插入 insertBefore
 * 3.2 在指定節點的之後插入 insertAfter
 * 4.1 根據對應的節點上的值刪除節點 deleteByNode
 * 4.2 根據對應的節點刪除節點  deleteByValue
 */
public class SinglyLinkedList {
    private Node head = null;
    public static class Node{
        public int data;
        public Node next;
        public Node() {
        }
    public Node(int data, Node node) {
            this.data = data;
            this.next = node;
        }
        public int getData() {
            return data;
        }
        public void setData(int data) {
            this.data = data;
        }
        public Node getNode() {
            return next;
        }
        public void setNode(Node node) {
            this.next = node;
        }
    }

    /**
     * 根據值查詢返回節點
     * @param data
     * @return
     */
    public Node findByValue(int data){
        Node p = head;
        while (p!=null && p.data != data){
              p = p.next;
        }
        return p;
    }

    /**
     * 根據角標查詢返回指定的角標的值的節點
     * @param raduis
     * @return
     */
    public Node findByIndex(int raduis){
        Node p = head;
        int pos = 0;
        while (p!=null && pos != raduis){
             p = p.next;
             pos++;
        }
        return p;
    }

    /**
     * 插入新的節點資料
     * @param data
     */
    public void  insertToHead(int data){
      Node newNode = new Node(data,null);
      insertToHead(newNode);
    }

    /**
     * 新節點
     * @param newNode
     */
    public void insertToHead(Node  newNode){
        if(head == null){
            head = newNode;
        }else {
           newNode.next = head;
           head = newNode;
        }
    }

    /**
     * 尾部插入
     * @param data
     */
    public void insertTail(int data){
     Node newNode = new Node(data,null);
     insertTail(newNode);
    }


    public void insertTail(Node newNode){
        if(head == null){
           head = newNode;
        }else {
          Node p = head;
          while (p != null){
             p = p.next;
          }
          p.next =newNode;
        }
    }


    /**
     * 在指定的節點之前插入節點資料
     * @param node 指定的節點
     * @param newNode 要插入的新的資料
     */
    public void insertBefore(Node node,Node newNode){
        if(node == null ){
            return;
        }
        if(head == null){
           insertToHead(newNode);
        }
        Node p = head;
        while (p!= null && p.next!= node){
            p = p.next;
        }
        if(p == null){
            return;
        }
        newNode.next = node;
        p.next = newNode;
    }

    /**
     * 在指定的節點之後插入資料
     * @param node 指定的節點
     * @param newNode 要插入資料
     */
    public void insertAfter(Node node,Node newNode){
       if(node == null){
           return;
       }
        if(head == null){
            insertToHead(newNode);
        }
        newNode.next = node.next;
        node.next = newNode;
    }


    /**
     * 刪除指定的節點
     * @param node 指定的節點資料
     */
    public void deleteByNode(Node node){
      if(head == null || node == null ){
          return;
      }
      if(node == head){
          head = head.next;
      }
      Node  p = head;
      while (p!= null && p.next != node){
         p = p.next;
      }
      if(p == null){
          return;
      }
      p = p.next.next;
      node.next = null;
    }

    /**
     * 根據指定的值刪除對應的連結串列節點
     * @param value 對應的值
     */
    public void deleteByValue(int value){
        if(head == null){
            return;
        }

        Node p = head;
        Node prev = null;
        while (p!=null && p.data != value){
            prev = p;
            p = p.next;
        }

        if(p == null){
           return;
        }

        if(prev == null){
           head = head.next;
        }else {
            prev.next = p.next;
            p.next = null;
        }

    }

}