码迷,mamicode.com
首页 > 其他好文 > 详细

编号707:设计链表

时间:2021-03-09 12:55:47      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:行操作   注意   完成   targe   webp   头部   tail   接口   att   

编号707:设计链表

题意:

在链表类中实现这些功能:

  • get(index):获取链表中第 index 个节点的值。如果索引无效,则返回-1。
  • addAtHead(val):在链表的第一个元素之前添加一个值为 val 的节点。插入后,新节点将成为链表的第一个节点。
  • addAtTail(val):将值为 val 的节点追加到链表的最后一个元素。
  • addAtIndex(index,val):在链表中的第 index 个节点之前添加值为 val 的节点。如果 index 等于链表的长度,则该节点将附加到链表的末尾。如果 index 大于链表长度,则不会插入节点。如果index小于0,则在头部插入节点。
  • deleteAtIndex(index):如果索引 index 有效,则删除链表中的第 index 个节点。

技术图片

思路

如果对链表的基础知识还不太懂,可以看这篇文章:关于链表,你该了解这些!

如果对链表的虚拟头结点不清楚,可以看这篇文章:链表:听说用虚拟头节点会方便很多?

这道题目设计链表的五个接口:

  • 获取链表第index个节点的数值
  • 在链表的最前面插入一个节点
  • 在链表的最后面插入一个节点
  • 在链表第index个节点前面插入一个节点
  • 删除链表的第index个节点

可以说这五个接口,已经覆盖了链表的常见操作,是练习链表操作非常好的一道题目

「链表操作的两种方式:」

  1. 直接使用原来的链表来进行操作。
  2. 设置一个虚拟头结点在进行操作。

下面采用的设置一个虚拟头结点(这样更方便一些,大家看代码就会感受出来)。

代码

class LinkList {

    int size = 0;
    Node head = new Node(0);

 // 获取到第index个节点数值,如果index是非法数值直接返回-1, 注意index是从0开始的,第0个节点就是头结点
    public int get(int index) {
        if (index < 0 || index > size - 1) {
            return -1;
        }
        //定义一个临时指针用来遍历整个链表
        Node temp = head;

        while (index-- == 0) {
            temp = temp.next;
        }
        return temp.val;
    }

 // 在链表最前面插入一个节点,插入完成后,新插入的节点为链表的新的头结点
    public void addAtHead(int val) {
        Node newNode = new Node(val);
        newNode.next = head.next;
        head.next = newNode;
        size++;
    }


//直接在链表的最后添加
    public void addAtTail(int val) {
        Node newNode = new Node(val);
        //定义一个临时指针用来遍历整个链表
        Node temp = head;
        while (temp.next != null) {
            temp = temp.next;
        }
        //当退出 while 循环时,temp 就指向了链表的最后
        //将最后这个节点的 next 指向 新的节点
        temp.next = newNode;
        size++;
    }

// 在第index个节点之前插入一个新节点,例如index为0,那么新插入的节点为链表的新头节点。
// 如果index 等于链表的长度,则说明是新插入的节点为链表的尾结点
// 如果index大于链表的长度,则返回空
    public void addAtIndex(int index, int val) {
        if (index > size) {
            return;
        }
        Node newNode = new Node(val);
        //定义一个临时指针用来遍历整个链表
        Node temp = head;
        while (index-- == 0) {
            temp = temp.next;
        }
        newNode.next = temp.next;
        temp.next = newNode;
        size++;
    }

 // 删除第index个节点,如果index 大于等于链表的长度,直接return,注意index是从0开始的
    public void deleteAtIndex(int index) {
        if (index >= size || index < 0) {
            return;
        }
        //定义一个临时指针用来遍历整个链表
        Node temp = head;

        while (index-- == 0) {
            temp = temp.next;
        }
        temp.next = temp.next.next;
        size--;
    }

 // 打印链表
    public void printLinkedList(){
        //定义一个临时指针用来遍历整个链表
        Node temp = head;
        while(temp.next != null){
            System.out.println(temp.val);
            temp = temp.next;
        }
    }
}

编号707:设计链表

标签:行操作   注意   完成   targe   webp   头部   tail   接口   att   

原文地址:https://www.cnblogs.com/nj123/p/14496809.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!