美文网首页
链表常用操作的代码实现

链表常用操作的代码实现

作者: TioSun | 来源:发表于2020-07-21 20:32 被阅读0次

以单链表为例,假设单链表的节点结构为

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

则单链表的实现如下

package linkedList;

/**
 * @author sunyixuan
 */
public class SingleLinkedList {

    private Node dummyHead = new Node(0);

    int length = 0;

    /**
     * 往链表头部插入数据
     * 原链表:dummyHead -> node -> null
     * 插入数据后:dummyHead -> newNode -> node -> null
     *
     * @param data 待插入的数据
     */
    public void addHead(int data) {

        Node newNode = new Node(data);
        // 将新插入节点的下一个节点指向虚拟头节点的下一个节点
        newNode.next = dummyHead.next;
        // 将虚拟头节点的下一节点指向新插入的节点
        dummyHead.next = newNode;
        length++;
    }

    /**
     * 往链表尾部插入数据
     * 原链表:dummyHead -> node -> null
     * 插入数据后:dummyHead -> node -> newNode -> null
     *
     * @param data 待插入数据
     */
    public void addLast(int data) {

        Node newNode = new Node(data);

        Node temp = dummyHead;

        while (temp.next != null) {
            temp = temp.next;
        }
        temp.next = newNode;
        length++;
    }

    /**
     * 按索引位置插入数据
     *
     * @param index 索引位置
     * @param data  数据
     */
    public void addIndex(int index, int data) {

        if (index < 0 || index > length) {
            throw new IndexOutOfBoundsException();
        }

        Node newNode = new Node(data);

        Node temp = dummyHead;

        for (int i = 0; i < index; i++) {
            temp = temp.next;
        }
        newNode.next = temp.next;
        temp.next = newNode;
        length++;
    }

    /**
     * 删除所有给定值
     * @param data 给定值
     */
    public void remove(int data) {

        Node prev = dummyHead;
        Node temp = dummyHead.next;

        while (temp != null) {

            if (temp.data == data) {
                prev.next = temp.next;
                temp = temp.next;
                length--;
            } else {
                prev = temp;
                temp = temp.next;
            }
        }
    }

    public void print() {

        Node current = dummyHead.next;
        while (current != null) {
            System.out.print(current.data + " -> ");
            current = current.next;
        }
        System.out.println("null");
    }

    /**
     * 反转链表
     */
    public void revert() {

        Node prev = dummyHead.next;
        if (prev == null) {
            return;
        }
        Node current = dummyHead.next.next;

        Node next = null;

        prev.next = null;

        while (current != null) {

            next = current.next;

            current.next = prev;

            prev = current;
            current = next;
        }
        dummyHead.next = prev;
    }

    public static void main(String[] args) {

        SingleLinkedList linkedList = new SingleLinkedList();

        linkedList.addHead(1);
        linkedList.addLast(2);
        linkedList.addLast(3);

        linkedList.print();

        linkedList.revert();

        linkedList.print();

        linkedList.remove(2);

        linkedList.print();
    }
}

相关文章

  • 链表常用操作的代码实现

    以单链表为例,假设单链表的节点结构为 则单链表的实现如下

  • #线性表之链表

    阅读目录 为什么要使用链表链表的存储结构链表的常用操作代码实现 1.为什么使用链表 通过上一篇的学习,我们知道顺序...

  • java实现链表

    链表各个操作中,数据的删除比较特殊,其中具体操作如图所示: java实现动态链表代码: 具体的测试代码: 测试结果...

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

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

  • 单向链表的reverse实现(三)

    上一篇的MyLinkedList实现了一个双向链表,如何对单向链表实现reverse操作呢?下面是实现代码,基本思...

  • 数据结构之双向链表

    1.双向链表 1.1双向链表创建示意图 分析 双向链表的遍历,添加,修改,删除的操作思路===》代码实现: 遍历 ...

  • markdown js实现链表list

    先学会js语法,再用js写好链表的代码可以实现链表的插入删除等操作,然后将写好的代码改为js格式的文件放入node...

  • 自己动手写数据结构之有序链表

    有序链表实现 代码实现

  • 链表基本操作及代码实现

    涉及到单链表的基本操作有如下: int initList(linkList *);//初始化一个单链表,具有头指针...

  • 链表

    文章结构 链表的定义 链表的插入和删除操作 链表的特性 常见的链表结构 自定义链表 链表的经典操作 使用链表实现L...

网友评论

      本文标题:链表常用操作的代码实现

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