你可以选择使用单链表或者双链表,设计并实现自己的链表。
单链表中的节点应该具备两个属性:val
和 next
。val
是当前节点的值,next
是指向下一个节点的指针/引用。
如果是双向链表,则还需要属性 prev
以指示链表中的上一个节点。假设链表中的所有节点下标从 0 开始。
实现 MyLinkedList
类:
MyLinkedList()
初始化 MyLinkedList
对象。int get(int index)
获取链表中下标为 index
的节点的值。如果下标无效,则返回 -1
。void addAtHead(int val)
将一个值为 val
的节点插入到链表中第一个元素之前。在插入完成后,新节点会成为链表的第一个节点。void addAtTail(int val)
将一个值为 val
的节点追加到链表中作为链表的最后一个元素。void addAtIndex(int index, int val)
将一个值为 val
的节点插入到链表中下标为 index
的节点之前。如果 index
等于链表的长度,那么该节点会被追加到链表的末尾。如果 index
比长度更大,该节点将 不会插入 到链表中。void deleteAtIndex(int index)
如果下标有效,则删除链表中下标为 index
的节点。提交到力扣的代码如下:
class ListNode {
private Integer val;
private ListNode next;
public void setVal(Integer val) {
this.val = val;
}
public void setNext(ListNode next) {
this.next = next;
}
public Integer getVal() {
return val;
}
public ListNode getNext() {
return next;
}
}
class MyLinkedList {
private ListNode listNode;
public void setListNode(ListNode listNode) {
this.listNode = listNode;
}
public ListNode getListNode() {
return listNode;
}
public MyLinkedList(ListNode head) {
listNode = head;
}
public MyLinkedList() {
}
public int get(int index) {
int size = size();
if (index < 0 || index > size - 1) {
return -1;
}
ListNode imghead = new ListNode();
imghead.setNext(listNode);
ListNode cur = imghead.getNext();
while (index > 0) {
cur = cur.getNext();
index = index - 1;
}
return cur.getVal(); //index=0也是返回cur本身,也就是第一个节点。 index不为0,最终的cur的值就是第index节点的值。
}
public int size() {//获取长度
ListNode cur = listNode;
int size = 0;
while (cur != null) {
size = size + 1;
cur = cur.getNext();
}
return size;
}
public void addAtHead(int val) {
ListNode newNode = new ListNode();//定义要插入的节点
newNode.setVal(val);//给要插入的节点赋值
ListNode imghead = new ListNode();
imghead.setVal(-1);
imghead.setNext(listNode);//定义虚拟头节点
ListNode cur = imghead.getNext();//当前节点移动到虚拟头节点的下一个节点
imghead.setNext(null);//断开虚拟头节点与下一个节点连接
imghead.setNext(newNode);//重新改变指向
newNode.setNext(cur);//重新改变指向
listNode = newNode;//最终符合题目要求的节点是newNode ,把newNode给listNode
}
//尾部插入节点
public void addAtTail(int val) {
ListNode newNode = new ListNode();//定义要插入的节点
newNode.setVal(val);//给要插入的节点赋值
ListNode imghead = new ListNode();
imghead.setVal(-1);
imghead.setNext(listNode);//定义虚拟头节点
ListNode cur = imghead;//
while (cur.getNext() != null) {
cur = cur.getNext();
}
cur.setNext(newNode);
listNode = imghead.getNext();
}
//在第index前节点插入一个节点
public void addAtIndex(int index, int val) {
int size = size();
if (index < 0 || index > size) {
System.out.println("传入的节点index小于0或index超过节点索引,无法插入数据");
} else if(index==size){
addAtTail(val);
}
else if (index == 0) {//在头节点前插入
addAtHead(val);
} else {//index从1到size-1之间
ListNode newNode = new ListNode();//定义要插入的节点
newNode.setVal(val);//给要插入的节点赋值
ListNode imghead = new ListNode();
imghead.setVal(-1);
imghead.setNext(listNode);//定义虚拟头节点
ListNode cur = imghead.getNext();
while (index > 1) {//寻找要插入节点的前一个节点,因为要找的是前一个节点,所以要大于1
cur = cur.getNext();
index = index - 1;
}
ListNode tmp = cur.getNext();//先存下下一个节点
cur.setNext(newNode);
newNode.setNext(tmp);
}
}
//删除第index的节点
public void deleteAtIndex(int index) {
int size = size();
if (index < 0 || index > size - 1) {
System.out.println("传入的节点index小于0或index超过节点索引,无法删除数据");
} else {
ListNode imghead = new ListNode();
imghead.setVal(-1);
imghead.setNext(listNode);//定义虚拟头节点
if (index == 0) {//删除第一个节点
ListNode tmp = imghead.getNext().getNext();
imghead.setNext(null);
imghead.setNext(tmp);
listNode = imghead.getNext();
} else {//index从1到size-1之间
ListNode cur = imghead.getNext();
while (index > 1) {//寻找要删除节点的前一个节点,因为要找的是前一个节点,所以要大于1
cur = cur.getNext();
index = index - 1;
}
ListNode tmp = cur.getNext().getNext();//先存下下一个节点
cur.setNext(tmp);
listNode = imghead.getNext();
}
}
}
}
/**
* Your MyLinkedList object will be instantiated and called as such:
* MyLinkedList obj = new MyLinkedList();
* int param_1 = obj.get(index);
* obj.addAtHead(val);
* obj.addAtTail(val);
* obj.addAtIndex(index,val);
* obj.deleteAtIndex(index);
*/
本地测试代码:
package com.company;
public class MyLinkedList {
private ListNode listNode;
public void setListNode(ListNode listNode) {
this.listNode = listNode;
}
public ListNode getListNode() {
return listNode;
}
public MyLinkedList(ListNode head) {
listNode = head;
}
public MyLinkedList() {
}
public int get(int index) {
int size = size();
if (index < 0 || index > size - 1) {
return -1;
}
ListNode imghead = new ListNode();
imghead.setVal(-1);
imghead.setNext(listNode);
ListNode cur = imghead.getNext();
while (index > 0) {
cur = cur.getNext();
index = index - 1;
}
return cur.getVal(); //index=0也是返回cur本身,也就是第一个节点。 index不为0,最终的cur的值就是第index节点的值。
}
public int size() {//获取长度
ListNode cur = listNode;
int size = 0;
while (cur != null) {
size = size + 1;
cur = cur.getNext();
}
return size;
}
public void addAtHead(int val) {
ListNode newNode = new ListNode();//定义要插入的节点
newNode.setVal(val);//给要插入的节点赋值
ListNode imghead = new ListNode();
imghead.setVal(-1);
imghead.setNext(listNode);//定义虚拟头节点
ListNode cur = imghead.getNext();//当前节点移动到虚拟头节点的下一个节点
imghead.setNext(null);//断开虚拟头节点与下一个节点连接
imghead.setNext(newNode);//重新改变指向
newNode.setNext(cur);//重新改变指向
listNode = newNode;//最终符合题目要求的节点是newNode ,把newNode给listNode
}
//尾部插入节点
public void addAtTail(int val) {
ListNode newNode = new ListNode();//定义要插入的节点
newNode.setVal(val);//给要插入的节点赋值
ListNode imghead = new ListNode();
imghead.setVal(-1);
imghead.setNext(listNode);//定义虚拟头节点
ListNode cur = imghead;//
while (cur.getNext() != null) {
cur = cur.getNext();
}
cur.setNext(newNode);
listNode = imghead.getNext();
}
//在第index前节点插入一个节点
public void addAtIndex(int index, int val) {
int size = size();
if (index < 0 || index > size) {
System.out.println("传入的节点index小于0或index超过节点索引,无法插入数据");
} else if(index==size){
addAtTail(val);
}
else if (index == 0) {//在头节点前插入
addAtHead(val);
} else {//index从1到size-1之间
ListNode newNode = new ListNode();//定义要插入的节点
newNode.setVal(val);//给要插入的节点赋值
ListNode imghead = new ListNode();
imghead.setVal(-1);
imghead.setNext(listNode);//定义虚拟头节点
ListNode cur = imghead.getNext();
while (index > 1) {//寻找要插入节点的前一个节点,因为要找的是前一个节点,所以要大于1
cur = cur.getNext();
index = index - 1;
}
ListNode tmp = cur.getNext();//先存下下一个节点
cur.setNext(newNode);
newNode.setNext(tmp);
}
}
//删除第index的节点
public void deleteAtIndex(int index) {
int size = size();
if (index < 0 || index > size - 1) {
System.out.println("传入的节点index小于0或index超过节点索引,无法删除数据");
} else {
ListNode imghead = new ListNode();
imghead.setVal(-1);
imghead.setNext(listNode);//定义虚拟头节点
if (index == 0) {//删除第一个节点
ListNode tmp = imghead.getNext().getNext();
imghead.setNext(null);
imghead.setNext(tmp);
listNode = imghead.getNext();
} else {//index从1到size-1之间
ListNode cur = imghead.getNext();
while (index > 1) {//寻找要删除节点的前一个节点,因为要找的是前一个节点,所以要大于1
cur = cur.getNext();
index = index - 1;
}
ListNode tmp = cur.getNext().getNext();//先存下下一个节点
cur.setNext(tmp);
listNode = imghead.getNext();
}
}
}
}
package com.company;
public class ListNode {
private Integer val;
private ListNode next;
public void setVal(Integer val) {
this.val = val;
}
public void setNext(ListNode next) {
this.next = next;
}
public Integer getVal() {
return val;
}
public ListNode getNext() {
return next;
}
}
package com.company;
import javax.swing.tree.TreeNode;
import java.lang.reflect.Array;
import java.util.*;
public class Main {
public static void main(String[] args) {
ListNode head = new ListNode();
head.setVal(2);
ListNode second = new ListNode();
second.setVal(3);
head.setNext(second);
ListNode third = new ListNode();
third.setVal(4);
second.setNext(third);
ListNode four = new ListNode();
four.setVal(5);
third.setNext(four);
ListNode five = new ListNode();
five.setVal(6);
four.setNext(five);
ListNode six = new ListNode();
six.setVal(7);
five.setNext(six);
MyLinkedList mylist = new MyLinkedList(head);
// int value= mylist.get(5);
// mylist.addAtHead(33);
// mylist.deleteAtIndex(6);
// mylist.addAtIndex(6,44);
// int value2= mylist.get(0);
}
}