题解

class MyLinkedList {
/**
* 伪头节点
*/
private ListNode dummyHead;
private ListNode tail;
private int size;
public static class ListNode {
int val;
ListNode next;
public ListNode(int val) {
this.val = val;
}
public ListNode(int val, ListNode next) {
this.val = val;
this.next = next;
}
}
public MyLinkedList() {
dummyHead = new ListNode(0);
tail = dummyHead;
size = 0;
}
/**
* 根据索引获取节点值
*
* @param index
* @return
*/
public int get(int index) {
ListNode node = getNode(index);
if (node == null) {
return -1;
} else {
return node.val;
}
}
/**
* 私有辅助方法,根据索引获取节点
*
* @param index
* @return
*/
private ListNode getNode(int index) {
if (index < 0 || index > size - 1) return null;
ListNode temp = dummyHead.next;
for (int i = 0; i < index && temp != null; i++) {
temp = temp.next;
}
return temp;
}
/**
* 在头部插入元素
*
* @param val
*/
public void addAtHead(int val) {
// 生成一个结点,存放的值为 val
ListNode addNode = new ListNode(val);
// 注意动静结合原则,添加结点时,注意修改 tail 指针
if (dummyHead == tail) tail = addNode;
ListNode tempHead = dummyHead.next;
dummyHead.next = addNode;
addNode.next = tempHead;
size ++;
}
/**
* 在尾部插入元素
*
* @param val
*/
public void addAtTail(int val) {
tail.next = new ListNode(val);
tail = tail.next;
size ++;
}
/**
* 在索引 index 处插入元素
*
* @param index
* @param val
*/
public void addAtIndex(int index, int val) {
if (index <= 0) {
// 如果 index 小于 0,则在头部插入结点
addAtHead(val);
} else if (index > size) {
// 如果 index 大于链表长度,则不会插入结点
} else if (index == size) {
// 如果 index 等于链表的长度,则该结点将附加到链表的末尾
addAtTail(val);
} else {
ListNode nodeWithPreIndex = getNode(index - 1);
ListNode tempNext = nodeWithPreIndex.next;
nodeWithPreIndex.next = new ListNode(val);
nodeWithPreIndex.next.next = tempNext;
size ++;
}
}
/**
* 删除索引为 index 的元素
*
* @param index
*/
public void deleteAtIndex(int index) {
// 如果index无效,那么什么也不做
if (index < 0 || index > size - 1) return;
// 找到index前面的结点
ListNode temp = dummyHead;
for (int i = 0; i < index && temp != null; i++) {
temp = temp.next;
}
// 如果要删除的是最后一个结点,那么需要更改tail指针
if (temp.next == tail) {
tail = temp;
}
// 执行删除
temp.next = temp.next.next;
size--;
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
ListNode listNode = dummyHead.next;
sb.append("size: ").append(size).append(" ; ");
while (listNode != null) {
sb.append(listNode.val).append("->");
listNode = listNode.next;
}
sb.append("NULL");
return sb.toString();
}
}