题目
题意:
在链表类中实现这些功能:
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);
// }
}