leetcode.707. 设计链表

本文详细介绍了如何在Java中实现一个单链表类,包括get方法获取指定索引的节点值,以及addAtHead、addAtTail、addAtIndex和deleteAtIndex方法进行节点的插入和删除操作。
摘要由CSDN通过智能技术生成

题目

题意:

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

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

思路

  • 创建成员变量size和head,在构造函数中初始化size和head。在增删节点的操作中维护变量size
  • 注意curr初始的指向位置和遍历循环的终止条件
    在这里插入图片描述

实现

// package com.dj.mall.algorithm.node;

//单链表
class ListNode {
    int val;
    ListNode next;
    ListNode(){}
    ListNode(int val) {
        this.val=val;
    }
}


class MyLinkedList {


    //链表长度
    int size;
    //虚拟头节点
    ListNode head;

    public MyLinkedList() {

        size = 0;
        head = new ListNode(0);

    }

    public int get(int index) {

        if(size == 0 || index < 0 || index > size - 1){
            return -1;
        }

        ListNode curr = head;

        //index + 1的元素
        while(index >= 0){
            curr = curr.next;
            index--;
        }

        return curr.val;
    }

    public void addAtHead(int val) {

        ListNode newNode = new ListNode(val);
        ListNode temp = head.next;
        head.next = newNode;
        newNode.next = temp;
        size ++;

    }

    public void addAtTail(int val) {

        //遍历到最后一个节点
        ListNode curr = head;

        while(curr.next != null){
            curr = curr.next;
        }

        curr.next = new ListNode(val);
        size ++;

    }

    public void addAtIndex(int index, int val) {


        if(index < 0 || index > size){
            return;
        }

        ListNode curr = head;

        //将curr遍历到index-1的节点
        while(index  > 0){
            curr = curr.next;
            index --;
        }

        ListNode newNode = new ListNode(val);
        ListNode temp = curr.next;
        curr.next = newNode;
        newNode.next = temp;

        size++;

    }

    public void deleteAtIndex(int index) {

        if(index < 0 || index > size - 1){
            return;
        }

        ListNode curr  =  head;

        while(index > 0 ){
            curr = curr.next;
            index --;
        }

        curr.next = curr.next.next;
        size --;
    }

    // public static void main(String[] args) {
    //      MyLinkedList myLinkedList = new MyLinkedList();
    //      myLinkedList.addAtTail(7);
    //      myLinkedList.get(0);
    //      myLinkedList.addAtHead(2);
    //      myLinkedList.addAtHead(1);
    //      myLinkedList.addAtIndex(3,0);
    //      myLinkedList.deleteAtIndex(2);
    //      myLinkedList.addAtHead(6);
    //      myLinkedList.addAtTail(4);
    //      myLinkedList.addAtHead(4);
    //      myLinkedList.get(4);
    //      myLinkedList.addAtIndex(5,0);
    //      myLinkedList.addAtHead(6);
    // }


}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

酱学编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值