你可以选择使用单链表或者双链表,设计并实现自己的链表。
单链表中的节点应该具备两个属性: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);
}
}