美文网首页
数据结构(四)-单链表

数据结构(四)-单链表

作者: 沧海一粟谦 | 来源:发表于2018-04-06 23:41 被阅读22次
    Game.of.Thrones

    单向链表是一种线性表,由一系列的节点(Node)组成。每个结点包括两个部分:存储数据元素的数据域和存储下一个结点地址的指针域。由于链表不按顺序存储,在插入的时候可以达到O(1)的复杂度,比顺序表快得多,但是查找一个节点时则需要O(n)的时间,而顺序表的时间复杂度是O(1)。

    package com.lq.linklist;
    /**
     * 链表结构,链结点
     */
    public class Node {
        //这里为了方便,将变量的属性设置为public
        public long data;//数据域 
        public Node next;//结点域(指针域)
    
        public Node(long value){
            this.data = value;
        }
    
        public void display(){
            System.out.print(data+" ");
        }
    }
    
    package com.lq.linklist;
    
    public class LinkList {
        
        private Node head;//头结点
    
        public LinkList(){
            head = null;
        }
        /**
         * 插入一个结点,在头结点后进行插入
         */
        public void insertFirst(long value){
            Node node = new Node(value);
            node.next = head;
            head = node;
        }
        /**
         * 在链表的指定位置插入结点。
         * index:插入链表的位置,从1开始
         * node:插入的结点
         */
        public void insertNodeById(int id,Node node){
            //首先需要判断指定位置是否合法,
            if(id<1||id>length()+1){
                System.out.println("插入位置不合法。");
                return;
            }
            int length = 1;           
            Node temp = head;       
            while(head.next != null){
                if(id == length++){                  
                    node.next = temp.next;//temp代表的是当前位置的前一个结点。            
                    temp.next = node;                
                    return;
                }
                temp = temp.next;
            }
        }
        /**
         * 删除一个结点,在头结点后进行删除
         */
        public Node deleteFirst(){
            Node temp = head;
            head = temp.next;
            return temp;
        }
        /**
         * 通过id删除指定位置的结点 
         */
        public void delNodeById(int id){
            //判断index是否合理
            if(id<1 || id>length()){
                System.out.println("给定的位置不合理");
                return;
            }
            int length=1;
            Node temp = head;
            while(temp.next != null){
                if(id == length++){             
                    temp.next = temp.next.next;    
                    return;
                }
                temp = temp.next;
            }    
        }
        /**
         * 显示方法
         */
        public void display(){
            Node current = head;
            while (current != null){
                current.display();   //打印结点
                current = current.next;
            }
        }
        /**
         * 查找方法
         */
        public Node find(long value){
            Node current = head;
            while (current.data != value){
                if (current.next == null){
                    System.out.println("没有这个数");
                    return null;
                }
                current = current.next;
               
            }
            return current;
        }
        /**
         * 删除方法,根据数据域来进行删除
         */
        public Node delete(long value){
            Node current = head;
            Node previous = head;//表示前一个结点
            while (current.data != value){
                if (current.next == null){
                    return null;
                }
                previous = current; 
                current = current.next; 
            }
            if (current == head){
                head = head.next;
            }else {
                previous.next = current.next;
            }
            return current;
        }
    
        /**
         * 计算单链表的长度,返回结点个数
         */
        public int length() {
            int length=0;
            Node temp = head;
            if(head==null){
                return length;
            }
            while(temp.next != null){
                length++;
                temp = temp.next;
            }
            return length+1;
        }
        /**
         * 对链表中的结点进行选择排序。
         */
        public void selectSortNode(){
            //判断链表长度大于2,不然只有一个元素,就不用排序了。
            if(length()<2){
                System.out.println("无需排序");
                return;
            }
            Node temp = head;            //第一层遍历使用的移动指针,最初指向头结点
            while(temp.next != null){    //第一层遍历链表,从第一个结点开始遍历
                Node secondTemp = temp.next;        
                while(secondTemp.next != null){//第二层遍历,从第二个结点开始遍历
                    if( temp.next.data > secondTemp.next.data){
                        long t = secondTemp.next.data;
                        secondTemp.next.data =  temp.next.data;
                        temp.next.data = t;                
                    }
                    secondTemp = secondTemp.next;
                }
                temp = temp.next;
            }        
        }
    }
    
    

    测试

    package com.lq.linklist;
    
    public class TestLinkList {
        public static void main(String[] args) {
            LinkList linkList = new LinkList();
            linkList.insertFirst(10);
            linkList.insertFirst(20);
            linkList.insertFirst(30);
            linkList.display();      
           
            Node node = linkList.find(10);
            node.display();    
           
            Node node1 =new Node(25);
            linkList.insertNodeById(1, node1);
            linkList.display();
        }
    }
    

    相关文章

      网友评论

          本文标题:数据结构(四)-单链表

          本文链接:https://www.haomeiwen.com/subject/zfrehftx.html