美文网首页
【数据结构】- 链表

【数据结构】- 链表

作者: lconcise | 来源:发表于2020-07-27 09:20 被阅读0次

链表

链表是一种数据结构,和数组同级。比如,Java中我们使用的ArrayList,其实现原理是数组。而LinkedList的实现原理就是链表了。链表在进行循环遍历时效率不高,但是插入和删除时优势明显。下面对单向链表做一个介绍。

单向链表是一种线性表,实际上是由节点(Node)组成的,一个链表拥有不定数量的节点。其数据在内存中存储是不连续的,它存储的数据分散在内存中,每个结点只能也只有它能知道下一个结点的存储位置。由N各节点(Node)组成单向链表,每一个Node记录本Node的数据及下一个Node。向外暴露的只有一个头节点(Head),我们对链表的所有操作,都是直接或者间接地通过其头节点来进行的。


image.png
image.png

单项列表Demo

public class MyLink {

    Node head = null;

    class Node {
        Node next;
        int data;

        public Node(int data) {
            this.data = data;
        }
    }

    public void addNode(int d) {
        Node node = new Node(d);
        if (head == null) {
            head = node;
            return;
        }
        Node tmp = head;
        while (tmp.next != null) {
            tmp = tmp.next;
        }
        tmp.next = node;
    }

    public boolean deleteNode(int index) {
        if (index < 0 || index >= length()) {
            return false;
        }
        if (index == 0) {
            head = head.next;
            return true;
        }
        int i = 1;
        Node preNode = head;
        Node curNode = preNode.next;
        while (curNode != null) {
            if (i == index) {
                preNode.next = curNode.next;
                return true;
            }
            preNode = curNode;
            curNode = curNode.next;
            i++;
        }
        return false;
    }

    public int length() {
        int length = 0;
        Node tmp = head;
        while (tmp != null) {
            length++;
            tmp = tmp.next;
        }
        return length;
    }

    public void printLink() {
        Node tmp = head;
        while (tmp != null) {
            System.out.print(tmp.data + " ");
            tmp = tmp.next;
        }
        System.out.println();
    }

    public static void main(String[] args) {
        MyLink myLink = new MyLink();
        myLink.addNode(0);
        myLink.addNode(1);
        myLink.addNode(2);
        myLink.addNode(3);
        myLink.addNode(4);

        myLink.deleteNode(2);

        myLink.printLink();
    }
}

递归实现链表反转

// 递归实现链表反转
public class LinkDemo {

    class Node {
        int val;
        Node next;

        public Node(int val) {
            this.val = val;
        }
    }

    public Node reverseNode(Node node) {
        return reverseNode(node, null);
    }

    private Node reverseNode(Node head, Node newNode) {
        if (head == null) {
            return newNode;
        }

        Node next = head.next;
        head.next = newNode;
        newNode = head;
        return reverseNode(next, newNode);
    }
}

相关文章

网友评论

      本文标题:【数据结构】- 链表

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