707. 设计链表

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/design-linked-list
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
使用虚拟头结点会容易些,这里使用的是头尾指针。
// 使用头尾指针
ListNode head;
ListNode tail;
// 用于记录链表中的数据个数
int size=0;
public MyLinkedList() {
}
public int get(int index) {
if(index >= size || index < 0) {
return -1;
}
ListNode cur = head;
for(int i=0;i<index;i++) {
cur = cur.next;
}
return cur.val;
}
public void addAtHead(int val) {
ListNode node = new ListNode(val);
node.next = head;
head = node;
if(tail == null) {
tail = node;
}
size++;
}
public void addAtTail(int val) {
ListNode node = new ListNode(val);
if(tail == null) {
tail = node;
head = node;
} else {
tail.next = node;
tail = node;
}
size++;
}
public void addAtIndex(int index, int val) {
if(index == size) {
addAtTail(val);
} else if(index <=0) {
addAtHead(val);
} else if(index > size) {
return;
}
else {
ListNode node = new ListNode(val);
ListNode cur= head;
for(int i=0;i<index-1;i++) {
cur = cur.next;
}
node.next = cur.next;
cur.next = node;
size++;
}
}
public void deleteAtIndex(int index) {
if(index <0 || index >= size) {
return;
}
if(index == 0) {
head = head.next;
if(head == null) {
tail = null;
}
} else {
ListNode prev = head;
for(int i=0;i<index-1;i++) {
prev = prev.next;
}
ListNode cur = prev.next;
prev.next = cur.next;
cur.next = null;
// 这里犯了一个大错,就是没有更新尾结点。
// 虽然不影响删除逻辑,但是之后的尾添加就收到影响了
// 所以一定要更新尾结点的状态
if(cur == tail) {
tail = prev;
}
}
size--;
}
浙公网安备 33010602011771号