链表

public class MyListNode {
    private static Node head = null;//头节点    
    //链表的每个节点类
    private class Node{
        int data;//每个节点的数据
        Node next;//每个节点指向下一个节点的连接
        
        public Node(int data){
            this.data = data;
        }
    }
    
    public int length(){
        int size = 0;
        Node tmp = head;
        while(tmp!=null){
            size++;
            tmp = tmp.next;
        }
        return size;
        
    }
    //从尾部插入节点
    public void addNode(int d){
        Node newNode = new Node(d);
        if(head == null){
            head = newNode;
            return;
        }
        Node tmp = head;
        while(tmp.next!=null){
            tmp = tmp.next; 
        }
        //add new node in the end
        tmp.next = newNode;
    }
    //从头部插入节点
    public void addHead(int s){
        Node newhead = new Node(s);
        if(head == null){
            head = newhead;
        }        
        else{
            newhead.next = head;
            head = newhead;
        }
    }
    //删除节点
    public void delNode(int a){
        if(a<1||a>length()){
            System.out.println("false");
        }
        else if(a==1){
            head = head.next;
            System.out.println("true");
        }
        else{
            int i=1;
            Node prenode = head;
            Node curnode = prenode.next;
            while(curnode!=null){
                if(i==(a-1)){
                    prenode.next = curnode.next;
                }
                prenode = curnode;
                curnode = curnode.next;
                i++;
            }
            System.out.println("true");
        }
    }
    //删除未知头节点的节点
    public void delnodenoh(Node delnode){
        if(delnode==null||delnode.next==null){
            System.out.println("This node can not be delected.");
        }
        int tmp = delnode.data;
        delnode.data = delnode.next.data;
        delnode.next.data = tmp;
        delnode.next = delnode.next.next;
        System.out.println("This node is delected.");
    }
    //删除重复节点
    public void delrepeatNode(Node head){
        Node p=head;
        while(p!=null){
            Node q=p;
            while(q.next!=null){
                if(p.data==q.next.data){
                    q.next = q.next.next;
                }
                else{
                    q = q.next;
                }
            }
            p = p.next;
        }
    }
    //查找节点
    public Node findnode(Node head, int k){
        if(k<1||k>this.length()){
            return null;
        }
        Node p1 = head;
        Node p2 = head;
        for(int i=0;i<k-1;i++)
            p1 = p1.next;
        while(p1!=null){
            p1 = p1.next;
            p2 = p2.next;                
        }
        return p2;
    }
    //查找中间节点
    public Node findcenter(Node head){
        Node p1 = head;
        Node p2 = head;
        while(p1!=null&&p1.next!=null&&p1.next.next!=null){
            p1 = p1.next.next;
            p2 = p2.next;
        }
        return p2;
    }
    //判断是否有环
    public void Loop(Node head){
        Node fast = head;
        Node slow = head;
        if(fast==null){
            System.out.println("false");
        }
        while(fast!=null&&fast.next!=null){
            fast = fast.next.next;
            slow = slow.next;
            if(fast==slow){
                System.out.println("true");
            }
        }
        System.out.println("false");
    }
    //查找环交点
    public Node Loopport(Node head){
        Node fast = head;
        Node slow = head;
        while(fast!=null&&fast.next!=null){
            fast = fast.next.next;
            slow = slow.next;
            if(fast==slow) break;
        }
        if(fast==null||fast.next==null)
            return null;
        slow = head;
        while(slow!=fast){
            slow = slow.next;
            fast = fast.next;
        }
        return slow;
    }
    //是否相交
    public Boolean meet(Node p1, Node p2){
        if(p1==null||p2==null){
            return false;
        }
        Node tail1 = p1;
        while(tail1.next!=null)
            tail1 = tail1.next;
        Node tail2 = p2;
        while(tail2.next!=null)
            tail2 = tail2.next;
        return tail1==tail2;        
    }
    //相交节点
    public Node meetnode(Node p1, Node p2){
        if(p1==null||p2==null){
            return null;
        }
        Node tail1 = p1;
        int len1 = 0;
        while(tail1.next!=null){
            tail1 = p1.next;
            len1++;
        }
        Node tail2 = p2;
        int len2 = 0;    
        while(tail2.next!=null){
            tail2 = tail2.next;
            len2++;    
        }
        if(tail1!=tail2)
            return null;
        Node t1 = p1;
        Node t2 = p2;
        if(len1>len2){
            int d = len1-len2;
            while(d!=0){
                t1 = t1.next;
                d--;
            }
        }
        else{
            int d = len2-len1;
            while(d!=0){
                t2 = t2.next;
                d--;
            }
        }
        while(t1!=t2){
            t1 = t1.next;
            t2 = t2.next;
        }
        return t1;
    }
    //反转链表
    public Node reverseListNode(Node head){
        //单链表为空或只有一个节点,直接返回原单链表
        if (head == null || head.next == null){
            return head;
        }
        Node preNode = null;
        Node curNode = head; 
        while (curNode != null){
            Node tmp = curNode.next;
            curNode.next = preNode;
            preNode = curNode;
            curNode = tmp;
        } 
        return this.head = preNode;
    }

    //链表排序
    public Node orderNode(){
        Node curNode = head;
        while(curNode != null){
            Node nextNode = curNode.next;
            while(nextNode != null){
                if(curNode.data > nextNode.data){
                    int temp = curNode.data;
                    curNode.data = nextNode.data;
                    nextNode.data = temp;
                }
                nextNode = nextNode.next;
            }
            curNode = curNode.next;
        }
        return head;
    }
    //输出链表
    public void printList(){
        Node tmp = head;
        while(tmp!=null){
            System.out.print(tmp.data+" ");
            tmp = tmp.next;
        }
        System.out.println();
    }
        //输出反转链表
    public void printListReversely(Node phead){
        if(phead!=null){
            printListReversely(phead.next);
            System.out.print(phead.data+" ");
        }
    }
    
    
    public static void main(String[] args){
        MyListNode list = new MyListNode();
        list.addHead(5);
        list.addHead(4);
        list.addHead(7);
        list.addHead(2);
        list.addHead(6);
        list.addHead(4);
        System.out.println("length = "+list.length());
        list.printList();
        list.addNode(5);
        list.addNode(4);
        list.addNode(7);
        list.addNode(2);
        list.addNode(6);
        list.addNode(4);
        System.out.println("length = "+list.length());
        System.out.println("before order:");
        list.printList();
        
//        list.findnode(head, 1);
        list.orderNode();
        System.out.println("after order:");
        list.printList();
        list.delNode(4);
        list.printList();        
         list.reverseListNode(head);
         list.printList();
        list.delrepeatNode(head);
        list.printList();
        list.printListReversely(head);
        
    }

}

 

posted @ 2019-07-29 11:02  Jocelyn-D  阅读(114)  评论(0编辑  收藏  举报