美文网首页
单向链表模拟实现

单向链表模拟实现

作者: syimo | 来源:发表于2016-11-14 15:58 被阅读0次

模拟LinckedList实现增删改查

  • ps:未考虑并发情况
  • 链表结构优点,删除,插入数据速度快,占用内存小。


public class LinkedListDemo {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        LinkedList linkedList = new LinkedList();
        linkedList.add(new Node("aaaa"));
        linkedList.add(new Node("bbbb"));
        linkedList.add(new Node("cccc1"));
        linkedList.add(new Node("cccc2"));
        linkedList.add(new Node("cccc3"));
        linkedList.add(new Node("cccc4"));
        linkedList.add(new Node("cccc5"));

        // linkedList.insert(new Node("hahahaah"), 4);
        // linkedList.delete(new Node("cccc1"));
        // linkedList.delete(new Node("cccc3"));
        // linkedList.delete(new Node("cccc4"));
        // linkedList.delete(0);
        // linkedList.delete(6);
        // linkedList.update(new Node("cccc2"), "aaaaaaaaaaaaaaaaaaaaaaaaa");
        // linkedList.update(5, "aaaaaaaaaaaaaaaaaaaaaaaaa");
        // System.out.println(linkedList.getPosition(new Node("aaaa")));
        // System.out.println(linkedList.getPosition(new Node("cccc2")));
        // System.out.println(linkedList.getPosition(new Node("ccccss2")));

        // System.out.println(linkedList.contain(new Node("cccc1")));
        // linkedList.traverse();
    }

}

class LinkedList {
    Node head;
    Node tail;
    int length;

    public LinkedList() {
        // TODO Auto-generated constructor stub
    }

    public void add(Node node) {
        if (head == null) {
            head = node;
            tail = node;
            length++;
        } else {
            tail.setNext(node);
            tail = node;
            length++;
        }
    }

    public void insert(Node node, int pos) {

        if (pos > length) {
            throw new RuntimeException("超出角标");
        }
        if (pos == 0) {
            Node temp = head;
            head = node;
            node.setNext(temp);
            length++;
            return;
        }
        if (pos == length) {
            tail.setNext(node);
            tail = node;
            length++;
            return;
        }
        Node previous = head;
        for (int i = 1; i < length; i++) {
            if (pos == i) {
                Node temp = previous.next;
                previous.setNext(node);
                node.setNext(temp);
                length++;
                return;
            }
            previous = previous.next;
        }
    }

    public void delete(Node node) {
        if (node.equals(head)) {
            head = head.next;
            length--;
            return;
        }
        Node previous = head;
        for (int i = 1; i < length; i++) {
            if (previous.next.equals(node)) {
                Node temp = previous.next.next;
                previous.setNext(temp);
                length--;
                return;
            }
            previous = previous.next;
        }
        throw new RuntimeException("not found");
    }

    public void delete(int pos) {
        if (pos == 0) {
            head = head.next;
            length--;
            return;
        }
        Node previous = head;
        for (int i = 1; i < length; i++) {
            if (pos == i) {
                Node temp = previous.next.next;
                previous.setNext(temp);
                length--;
                return;
            }
            previous = previous.next;
        }
        throw new RuntimeException("not found");

    }

    public void update(Node node, String data) {
        Node current = head;
        for (int i = 0; i < length; i++) {
            if (current.equals(node)) {
                current.setData(data);
                return;
            }
            current = current.next;
        }

        throw new RuntimeException("not found");
    }

    public void update(int pos, String data) {
        Node current = head;
        for (int i = 0; i < length; i++) {
            if (pos == i) {
                current.setData(data);
                return;
            }
            current = current.next;
        }

        throw new RuntimeException("not found");
    }

    public int getPosition(Node node) {
        Node current = head;
        for (int i = 0; i < length; i++) {
            if (current.equals(node)) {
                return i;
            }
            current = current.next;
        }

        return -1;
    }

    public boolean contain(Node node) {
        return !(getPosition(node) == -1);
    }

    public void traverse() {
        Node current = head;
        for (int i = 0; i < length; i++) {
            System.out.println(current.data);
            current = current.next;
        }
    }

    public int size() {
        return length;
    }

}

class Node {
    String data;
    Node next;

    Node(String data) {
        this.data = data;
    }

    public String getData() {
        return data;
    }

    public void setData(String data) {
        this.data = data;
    }

    public Node getNext() {
        return next;
    }

    public void setNext(Node next) {
        this.next = next;
    }

    public boolean equals(Object obj) {
        if (!(obj instanceof Node)) {
            throw new RuntimeException("cast exception");
        }
        Node compare = (Node) obj;
        return this.data.equals(compare.data);
    }

}

相关文章

  • 单向链表模拟实现

    模拟LinckedList实现增删改查 ps:未考虑并发情况 链表结构优点,删除,插入数据速度快,占用内存小。

  • 链表

    一、单向链表 单向链表的普通实现 Java实现: Kotlin实现: 单向链表的递归实现 Java实现: 二、双向...

  • 8.单向链表SingleLinkList

    目录:1.单向链表的定义2.单向链表的图解3.单向链表定义操作4.单向链表的实现 1.单向链表的定义 2.单向链表...

  • 10.单向循环链表SingleCycleLinkList

    目录:1.单向循环链表的定义2.单向循环链表的图解3.单向循环链表定义操作4.单向循环链表的实现 1.单向循环链表...

  • 单链表 & 双链表& 单向循环链表的实现

    单链表 具体实现: 双链表 代码实现: 单向循环链表的实现 代码实现:

  • 链表反转

    概述 链表反转是非常经典的面试题,要实现此功能,需先实现链表的数据结构。 链表类 获得单向链表方法 输出单向链表方...

  • 单向链表反转(含图解)

    前言 上次讲解了单向链表的原理《Java实现单向链表功能》,今天拓展一下实现链表的翻转。下面直接上代码。 链表初始...

  • Java实现有环的单向链表,并判断单向链表是否有环

    Java实现有环的单向链表,并判断单向链表是否有环 有一个单向链表,链表当中有可能出现环,就像下图这样。我们如何判...

  • JavaScript数据结构与算法-链表练习

    链表的实现 一. 单向链表 二. 双向链表 三. 循环链表 练习 一. 实现advance(n)方法,使当前节点向...

  • 数组模拟单向链表

    链表的定义 链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。...

网友评论

      本文标题:单向链表模拟实现

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