2022-07-25 第二组 程梓杭 Java(9) 链表练习


今日学习内容:链表练习

一、什么是链表?

下面有三张图,分别是链表单元——结点、链表概念和链表实际模型。

image
image
image

结点由两部分组成,第一部分用于存储数据,第二部分是本结点的下一个结点。这样就形成了一个递归的结构,直到最后一个结点为空时结束递归。根据这种结构的数据模型,于是就有了链表概念和链表实际模型。

这里有一个值得注意的点在于,头结点是否应该存数据,存与不存其实对链表没有太大的影响,只需注意访问位置时的实际循环次数判断。

image

链表基本操作:

  • 删除链表(初始化链表)(赋空)(删除头结点)
  • 在链表尾部添加结点
  • 在任意位置添加结点(插入)
  • 删除尾部结点
  • 删除任意位置结点
  • 查询目标结点位置

代码示例:

Node类(单击展开)
public class Node {

    private Integer data;
    private Node next;

    public Integer getData() {
        return data;
    }

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

    public Node getNext() {
        return next;
    }

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

    public Node() {
    }

    public Node(Integer data, Node next) {
        this.data = data;
        this.next = next;
    }

    @Override
    public String toString() {
        return "Node{" +
                "data=" + data +
                ", next=" + next +
                '}';
    }
}
链表方法(单击展开)
public class SuperLinked {

    // 链表的长度
    private int size;
    // 链表的第一个结点
    private Node first;
    // 链表的最后一个结点
    private Node last;
    // 把数组添加到链表的尾部
    public boolean add(Integer data) {
        // 把传入的数据构建成一个结点
        Node node = new Node(data, null);
        // 如果现在链表是空的,那我就是第一个结点
        if ( first == null ) {
            first = node;
        } else {
            // 如果链表不是空,那我就是最后一个结点
            // 我应该是在原来的last结点后面
            // 我是原来last结点的下一个结点
            last.setNext(node);
        }
        last = node;
        size++;
        return true;
    }

    public Node getNode(int index) {
        if ( index < 0 ) {
            index = 0;
        }
        if ( index >= size - 1 ) {
            index = size - 1;
        }
        // 找到第index个
        Node cursor = first;
        for (int i = 0; i < index; i++) {
            cursor = cursor.getNext();
        }
        return cursor;
    }

    public boolean inputNode(int index, Integer data) {

        if ( getNode(index) == null ) return false;
        if ( getNode(index) != null ) {
            Node nodeN = new Node(data, getNode(index - 1));
            getNode(index - 2).setNext(nodeN);
            size++;
        }
        return true;
    }

    public boolean removeLast() {
        if ( getNode(0) == null ) {
            return false;
        } else if ( size == 1 ) {
            first = null;
            size--;
        } else if ( getNode(0) != null ) {
            getNode(size - 2).setNext(null);
            last = getNode(size - 2);
            size--;
        }
        return true;
    }

    public boolean rewriteData(int index, Integer data) {
        getNode(index).setData(data);
        return true;
    }

    public int getSize() {
        return size;
    }
}
测试类(单击展开)
public class Demo {

    public static void main(String[] args) {
        SuperLinked superLinked = new SuperLinked();
        superLinked.add(1);
        superLinked.add(2);
        superLinked.add(3);
        superLinked.inputNode(2,25);
        superLinked.removeLast();
        System.out.println(superLinked.getNode(0));
    }
}

一些思考:

数据结构的核心在于理解这些结构的创建和存在方式,然后再慢慢理解方法是如何完成的。
在理解的过程中需要记录方法名和方法作用,这样在遇到方法内调用方法时才能更快反应过来。
要善于总结,例如在学习这些数据结构时,我们会发现基本方法内容无外乎增删改查,偶尔出现特殊方法需要加以记忆。
要有耐心,这些数据结构确实构造难以理解且方法繁多,需要看到末尾甚至多次看完才可能有所理解。

原创文章,作者:254126420,如若转载,请注明出处:https://blog.ytso.com/276958.html

(0)
上一篇 2022年7月25日
下一篇 2022年7月25日

相关推荐

发表回复

登录后才能评论