美文网首页IT@程序员猿媛数据结构程序员
链表----链表中元素的获取、查询和修改

链表----链表中元素的获取、查询和修改

作者: wfaceboss | 来源:发表于2019-04-02 14:27 被阅读5次

本节是在上一小节的基础上继续完善我们的链表相关方法的编写,在本节中我们着重对如何获取链表中元素、查询元素以及修改元素进行学习。

一、获取元素

1.关于获取链表中元素的方法的分析

由于我们使用了虚拟头结点,而我们每次都需要从第一个真实节点开始,因此需要首先得到虚拟头结点的下一个节点是谁,然后在此基础上进行遍历工作,相关代码如下:

//获取链表的第index(0-based)个位置的元素   (实际不常用,练习用)
    public E get(int index) {
        //合法性判断
        if (index < 0 || index >= size) {
            throw new IllegalArgumentException("Get failed,Illegal index");
        }

        Node<E> cur = dummyHead.next;
        for (int i = 0; i < index; i++) {
            cur = cur.next;
        }
        return cur.e;
    }

2.获得链表的第一个元素

对于该方法则是依靠在get()方法的。

  //获得链表的第一个元素
    public E getFirst() {
        return get(0);
    }

3.获得链表的最后一个元素

对于该方法页是依靠在get()方法的。

//获得链表的最后一个元素
    public E getLast() {
        return get(size - 1);
    }

二、修改链表元素

由于我们使用了虚拟头结点,而我们每次都需要从第一个真实节点开始,因此需要首先得到虚拟头结点的下一个节点是谁,然后在此基础上进行遍历工作,相关代码如下:

//修改链表的第index(0-based)个位置的元素   (实际不常用,练习用)
    public void set(int index, E e) {
        //合法性判断
        if (index < 0 || index >= size) {
            throw new IllegalArgumentException("update failed,Illegal index");
        }

        Node<E> cur = dummyHead.next;
        for (int i = 0; i < index; i++) {
            cur = cur.next;
        }
        cur.e = e;
    }

三、判断是否有元素e

由于我们使用了虚拟头结点,而我们每次都需要从第一个真实节点开始,因此需要首先得到虚拟头结点的下一个节点是谁,然后判断给定的元素值与链表中的元素值内容是否相等(equals()方法),若相等则返回true,否则返回false

//查找链表中是否有元素e
    public boolean contains(E e) {
        Node<E> cur = dummyHead.next;
        while (cur != null) {
            if (cur.e.equals(e)) {
                return true;
            }
            cur = cur.next;
        }
        return false;
    }

四、toString()方法的重写

为了在输出该链表对象时可以查看相关自定义的信息,我们对toString()进行重写改造。

//重写object类,便于测试
    @Override
    public String toString() {
        StringBuilder res = new StringBuilder();
        Node<E> cur = dummyHead.next;
        while (cur != null) {
            res.append(cur + "->");
            cur = cur.next;
        }

        res.append("NULL");

        return res.toString();
    }

此时该方法等同于

//重写object类,便于测试
    @Override
    public String toString() {
        StringBuilder res = new StringBuilder();

        for (Node<E> cur = dummyHead.next; cur != null; cur = cur.next) {
            res.append(cur + "->");
        }
        res.append("NULL");

        return res.toString();
    }

五、测试

新建一个main函数,填写相关测试代码如下:

package LinkedList;

public class TestMain {
    public static void main(String[] args) {
        LinkedList<Integer> linkedList = new LinkedList<Integer>();

        System.out.println("============在链表头部添加============");
        for (int i = 0; i < 5; i++) {
            linkedList.addFirst(i);
            System.out.println(linkedList);
        }


        System.out.println("============修改链表============");
        linkedList.set(2,666);
        System.out.println(linkedList);
    }
}

结果为:


image.png

结果分析:由于是在链表头部添加元素,故最终显示结果为从右到左,最右为NULL(也就是最后一个节点)。
关于本小节,若您觉得还行、还过得去,麻烦给个推荐吧,谢谢!!

相关文章

  • 链表----链表中元素的获取、查询和修改

    本节是在上一小节的基础上继续完善我们的链表相关方法的编写,在本节中我们着重对如何获取链表中元素、查询元素以及修改元...

  • python数据结构——单链表

    链表 python实现链表链表的初始化创建元素的插入和删除链表的遍历元素的查询链表的删除链表的逆序判断链表是否有环...

  • Hashmap的一些问题

    数组和链表是如何组织工作的? 数组:查询快,增删慢链表:查询慢,增删快 概念:数组里的元素是连续的链表的每个元素都...

  • c语言链表操作

    链表的创建 链表原地翻转 链表结点删除 头插法添加结点 修改链表某个结点的值 相当于查找元素,修改其关联元素的值 ...

  • 单链表 C++

    单链表 C++ 题目 1、创建单链表2、初始化单链表3、释放单链表4、获取单链表中元素的数量5、输出单链表中的所有...

  • 合并k个顺序链表

    先每个链表读首位元素,优先队列pop的时候删除对应链表首位元素然后修改list指针,将新首位元素放入优先队列中,如...

  • 数据结构与算法学习 (04)双向链表和双向循环列表

    1双向链表单链表只能从头结点开始访问链表中的数据元素,如果需要逆序访问单链表中的数据元素将极其低效。双链表是链表的...

  • 算法图解 (二)

    第二章 选择排序 本节内容数组、链表和选择排序 链表 链表中的元素可以存储在内存的任何地方 链表的每个元素都存储了...

  • 双向链表

    1、双向链表 单链表只能从头结点first开始访问链表中的数据元素,如果需要逆序访问单链表中的数据元素将极其低效。...

  • 数据结构之链表及其栈和队列的实现

    链表的基本操作 定义 从链表头部插入元素 从链表头部删除元素 从链表尾部插入元素 从中间插入和删除结点 栈和对列的...

网友评论

    本文标题:链表----链表中元素的获取、查询和修改

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