数据结构(四)-单链表

2018-04-06  本文已影响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();
    }
}
上一篇下一篇

猜你喜欢

热点阅读