题目介绍
力扣707题:leetcode-cn.com/problems/de…
方法:单向链表
按照题目要求,需要实现链表的增删改查功能,所以需要我们自己定义实现功能的数据结构,很容易就能够想到使用单链表的数据结构,该结构简单定义如下:
class ListNode {
int val;//节点值
ListNode next;//指向下一个节点的指针
public ListNode(int val) {
this.val = val;
}
}
接着,我们这里还需要定义一个哑节点ListNode dumy,指向单链表的头节点的上一个节点,即dumy.next指向单链表的头节点,还需要使用变量size来记录当前链表的节点个数,当添加节点时,size++,当删除节点时,执行size--。
代码如下:
class MyLinkedList {
class ListNode {
int val;//节点值
ListNode next;//指向下一个节点的指针
public ListNode(int val) {
this.val = val;
}
}
//链表的头节点上一个节点
ListNode dumy = null;
int size = 0;//节点个数
public MyLinkedList() {
dumy = new ListNode(-1);//初始化哑节点
dumy.next = null;
}
public int get(int index) {
if(index < 0 || index >= size) {
return -1;
}
ListNode temp = dumy.next;
for(int i = 0 ; i < index; i++) {
temp = temp.next;
}
return temp.val;
}
/**
* 在链表头添加节点
*/
public void addAtHead(int val) {
ListNode newHead = new ListNode(val);
newHead.next = dumy.next;
dumy.next = newHead;
size++;
}
/**
*在链表末尾元素
*/
public void addAtTail(int val) {
ListNode temp = dumy;
while(temp.next != null) {
temp = temp.next;
}
ListNode tailNode = new ListNode(val);
temp.next = tailNode;
size++;
}
/**
* 在指定索引添加元素,同样也需要找到该索引的上一个节点
*/
public void addAtIndex(int index, int val) {
if(index > size) {
return;
}else if(index == size) {
//在末尾插入节点
addAtTail(val);
}else if(index <= 0) {
//在链表的头部插入节点
addAtHead(val);
}else {
//普通插入节点
ListNode temp = dumy;
for(int i = 0; i < index ; i++) {
temp = temp.next;
}
ListNode insertNode = new ListNode(val);
insertNode.next = temp.next;
temp.next = insertNode;
size++;
}
}
/**
* 删除指定索引的节点,需要找到该索引的对应节点的上一个节点
*/
public void deleteAtIndex(int index) {
if(index < 0 || index >= size) {
return;
}
ListNode temp = dumy;
for(int i = 0; i < index; i++) {
temp = temp.next;
}
temp.next = temp.next.next;
size--;
}
}
复杂度分析
- 时间复杂度:O(N),N为链表的节点个数
- 空间复杂度:O(1)