数据结构学习之路二

今天本狗想记录一下关于学习链表过程中的一些心得。

链表,这是一个让本狗当时比较费脑筋的东西。

老规矩,我就不扯从书上看到的知识点了,直接用简单的,本狗的理解出发,链表,本狗认为,就是不连续的数组,他们怎样联系呢?将每一个块分为数据域和指针域两个部分,数据域存放数据,指针域存放下一个块的位置,这样,就可以知道具体的位置了。

有关链表的优缺点,大概就是需要和线性表就行比较了。

插入、删除方便,查找不方便。

对于链表,还是直接拿代码上手分析比较带劲。

我们首先定义链表必须的数据域和指针域,同时再构造方法中进行初始化,然后定义一个显示的方法

public class Node {
    //数据域
    public long data;
    //指针域
    public Node next;
    
    public Node(long value){
        this.data = value;
    }
    //显示方法
    public void display(){
        System.out.println(data + " ");
    }
}

 接下来定义方法


//  链表,相当于火车
 
public class LinkList {
    //头结点
    private Node first;
    
    public LinkList() {
        first = null;
    }
    
 
    // 插入一个结点,在头结点后进行插入
  
    public void insertFirst(long value) {
        Node node = new Node(value);
        node.next = first;
        first = node;
    }
    
  
     // 删除一个结点,在头结点后进行删除
   
    public Node deleteFirst() {
        Node tmp = first;
        first = tmp.next;
        return tmp;
    }
    
  
     //显示方法
  
    public void display() {
        Node current = first;
        while(current != null) {
            current.display();
            current = current.next;
        }
        System.out.println();
    }
    
 
   //  查找方法
   
    public Node find(long value) {
        Node current = first;
        while(current.data != value) {
            if(current.next == null) {
                return null;
            }
            current = current.next;
        }
        return current;
    }
    
  
     // 删除方法,根据数据域来进行删除
   
    public Node delete(long value) {
        Node current = first;
        Node previous = first;
        while(current.data != value) {
            if(current.next == null) {
                return null;
            }
            previous = current;
            current = current.next;
        }
        
        if(current == first) {
            first = first.next;
        } else {
            previous.next = current.next;
        }
        return current;
        
    }
}

第一个方法是插入

对插入怎样理解呢,如上图, 1、2步一样,首先,我们用

node.next = first;让头结点指向待插入结点的后继,也就是下一个结点的位置,
first = node;接下来第二步,待插入结点指向头结点。这样就完成一个插入过程。

删除过程呢,比较简单

 正常的是1、2顺序,若要删除待删除结点,只需要执行第三步就自动将其删除,虚拟机的垃圾回收机制会自动将其回收。

Node tmp = first;//将头结点给指向要删除的结点
first = tmp.next;//然后要删除结点的next指向first,此时虚拟机就会回收待删除结点。

 显示方法呢?

调用递归方式来完成。

查找方法?

让头结点指向current指针,判断此指针是否等于传入的数值,不等于,判断此指针的指针域是否为空,空则直接返回,不为空,则让此指针的next指向current指针。

删除方法相同。

进行测试

package dataStructs;

public class TestLinkList {
    public static void main(String[] args) {
        LinkList linkList = new LinkList();
        linkList.insertFirst(34);
        linkList.insertFirst(23);
        linkList.insertFirst(12);
        linkList.insertFirst(0);
        linkList.insertFirst(-1);

//    linkList.display();
//    
//    linkList.deleteFirst();
//    linkList.display();
//    
//    Node node = linkList.find(23);
//    node.display();

        Node node1 = linkList.delete(0);
        node1.display();
        System.out.println();
        linkList.display();
    }
}

 结果和测试数据因输入而异。

猜你喜欢

转载自blog.csdn.net/huaicainiao/article/details/89460309
今日推荐