zoukankan      html  css  js  c++  java
  • 3.4链表----链表中元素的获取、查询和修改

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

    一、获取元素

    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);
        }
    }

    结果为:

    结果分析:由于是在链表头部添加元素,故最终显示结果为从右到左,最右为NULL(也就是最后一个节点)。

     关于本小节,若您觉得还行、还过得去,麻烦给个推荐吧,谢谢!!

  • 相关阅读:
    Net框架下的XSLT转换技术简介
    ASP.NET单点登录(代码)
    IE直接下载汇总
    获取客户端网卡MAC地址和IP地址的几种方法(一)
    .NET专区用ASP.Net获取客户端网卡的MAC
    C#枚举系统安装的所有打印机
    Div+CSS布局入门教程
    动态加载JS脚本的4种方法
    WebService获取服务端硬件信息和客户端IP,MAC,浏览器信息,所在城市
    股票中的名词解释
  • 原文地址:https://www.cnblogs.com/wfaceboss/p/10641830.html
Copyright © 2011-2022 走看看