设计单向链表,借助pre前节点,需要根据测试用例不断debug完善各种可能情况。
class MyLinkedList {
// 记录链表长度
int size;
// 链表头指针,每次操作(除了头插)头指针位置应当不变
ListNode head;
public MyLinkedList() {
// 链表初始长度为0
size = 0;
}
public int get(int index) {
// index越界或小于0直接退出
if (index > size-1 || index < 0) {
return -1;
}
// 遍历到指定位置
ListNode tmp = head;
while (index>0) {
tmp = tmp.next;
index--;
}
return tmp.val;
}
// 设置一个前节点,将新节点插入前节点后面
public void addAtHead(int val) {
ListNode tmp = head;
// 空指针
ListNode pre = new ListNode();
pre.next = head;
ListNode newNode = new ListNode(val);
pre.next = newNode;
newNode.next = head;
head = newNode;
size++;
}
public void addAtTail(int val) {
// 插入元素为链表第一个元素
if (size == 0) {
head = new ListNode(val);
size++;
return;
}
// 遍历到指定位置
ListNode tmp = head;
while (tmp.next != null) {
tmp = tmp.next;
}
tmp.next = new ListNode(val);
size++;
}
public void addAtIndex(int index, int val) {
// index越界或小于0直接退出
if (index > size || index < 0) {
System.out.println(size);
return;
}
// 遍历到指定位置
int tmpIndex = index;
ListNode tmp = head;
ListNode pre = new ListNode();
pre.next = head;
while (index > 0) {
tmp = tmp.next;
pre = pre.next;
index--;
}
ListNode newNode = new ListNode(val);
pre.next = newNode;
newNode.next = tmp;
// 头节点添加
if (tmpIndex == 0) {
head = newNode;
}
size++;
}
public void deleteAtIndex(int index) {
// index越界或小于0直接退出,注意是 index > size-1
if (index > size-1 || index < 0) {
return;
}
// 遍历到指定位置
int tmpIndex = index;
ListNode tmp = head;
ListNode pre = new ListNode();
pre.next = head;
while (index > 0) {
tmp = tmp.next;
pre = pre.next;
index--;
}
if (tmpIndex == size-1) {
// 要删除的节点是最后一个节点
pre.next = null;
}
else if(tmpIndex == 0) {
// 要删除的节点是头节点
pre.next = tmp.next;
head = tmp.next;
}
else {
pre.next = tmp.next;
tmp.next = null;
}
size--;
}
}
// 链表节点
class ListNode {
// 节点值
int val;
// 链表指针
ListNode next;
public ListNode() {}
public ListNode(int val) {
this.val = val;
}
}
/**
* 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);
*/