1. 程式人生 > >JAVA帶表頭的雙向鏈表插入,刪除,查找操作

JAVA帶表頭的雙向鏈表插入,刪除,查找操作

emp empty 元素 system lean span java [] pre

1.建立雙向鏈表的結點Node
2.建立類Linkedlist,成員head是指向表頭的引用,在linkedlist中定義鏈表的操作方法。
ps:插入刪除操作要判斷pos,如果在表尾,要特判防止出現空引用。
public class Node {//建立雙向鏈表的結點
    public Node left;
    public Node right;
    public int data;
    public Node(){
        this.left=null;
        this.right=null;
        this.data=0;
    }
    public
Node(int data) { this.data=data; } }


public
class Linkedlist { public Node head;//指向表頭地址的引用 public int length; public Linkedlist(){//建立頭結點 length=0; head=new Node(); head.data=0; head.left=null; head.right=null; } public boolean
Insert(int pos,Node node) {//在下標為pos-1和pos的結點之間插入node結點 int count=0; Node preNode=head; while(preNode!=null&&count<pos-1) { ++count; preNode=preNode.right; } if(preNode==null||count!=pos-1){ return false; }
if(preNode.right==null) { preNode.right=node; node.left=preNode; node.right=null; ++length; return true; } Node nextNode=preNode.right; node.right=nextNode; node.left=preNode; preNode.right=node; nextNode.left=node; ++length; return true; } public boolean Delete(int pos) {//刪除指定位置的結點 if(pos<0||pos>=length) { return false; } int count=0; Node curNode=head; while(count!=pos&&curNode!=null) { ++count; curNode=curNode.right; } if(count!=pos||curNode==null) { return false; } if(curNode.right==null) { curNode.left.right=null; curNode=null; } if(curNode.right!=null) {// curNode.left.right=curNode.right; curNode.right.left=curNode.left; } --length; return true; } public int Size() {//返回鏈表元素個數 return length; } public boolean isEmpty() { if(length==0) { return true; } return false; } public boolean Traverse() {//輸出鏈表 Node preNode=head; while(preNode.right!=null) { preNode=preNode.right; System.out.print(preNode.data+" "); } return true; } public int getData(int pos) {//取得指定位置結點元素 Node preNode=head; int count=0; while(count!=pos) { preNode=preNode.right; ++count; } return preNode.data; } public boolean Delete(Node node) {//刪除node結點 Node curNode=head; while(curNode!=node&&curNode!=null) { curNode=curNode.right; } if(curNode!=node) { return false; } if(curNode.right!=null) { curNode.left.right=curNode.right; curNode.right.left=curNode.left; --length; return true; } if(curNode.right==null) { curNode.left.right=null; --length; return true; } return false; } }
public class Main {
    public static void main(String[] args) {
        Linkedlist link=new Linkedlist();
        //System.out.println(link.head==null);
        Node node1=new Node(1);
        Node node2=new Node(3);
        Node node3=new Node(5);
        Node node4=new Node(9);
        Node node5=new Node(2);
        boolean f=link.Insert(1,node1);
        f=link.Insert(2, node2);
        f=link.Insert(3, node3);
        f=link.Insert(4, node4);
        f=link.Insert(5, node5);
        //System.out.println(link.head.data);
        //System.out.println(link.head.right.data);
        //System.out.println(f);
        //Node node=node1;
        link.Delete(2);
        link.Delete(node5);
        boolean g=link.Delete(node3);
       // System.out.println("g="+g);
       //while(node!=null) {
       // System.out.println(node.data);
       // node=node.right;
       // }
       System.out.println("size="+link.Size());
       System.out.println("isempty? "+link.isEmpty());
       link.Traverse();
       System.out.println();
       System.out.println("data2="+link.getData(2));
       
    }
}

 

JAVA帶表頭的雙向鏈表插入,刪除,查找操作