标题:707设计链表-中等
题目
示例
MyLinkedList linkedList = new MyLinkedList();
linkedList.addAtHead(1);
linkedList.addAtTail(3);
linkedList.addAtIndex(1,2); //链表变为1-> 2-> 3
linkedList.get(1); //返回2
linkedList.deleteAtIndex(1); //现在链表是1-> 3
linkedList.get(1); //返回3
提示
- 所有
val
值都在 [1, 1000]
之内。 - 操作次数将在
[1, 1000]
之内。 - 请不要使用内置的 LinkedList 库。
代码Java
public class MyLinkedList {
int size;
ListNode head;
public MyLinkedList() {
size = 0;
head = new ListNode(0, null);
}
public int get(int index) {
if (index >= size || index < 0)
return -1;
ListNode p = head.next;
for (int i = 0; i < index; i++) {
p = p.next;
}
return p.val;
}
public void addAtHead(int val) {
ListNode p = new ListNode();
p.val = val;
p.next = head.next;
head.next = p;
size++;
}
public void addAtTail(int val) {
ListNode p = new ListNode();
ListNode s = new ListNode();
s.next = null;
s.val = val;
if (head.next != null) p = head.next;
else head.next = s;
while (p.next != null) {
p = p.next;
}
p.next = s;
size++;
}
public void addAtIndex(int index, int val) {
if (index > size) return;
if (index < 0) {
addAtHead(val);
return;
}
if (index == size) {
addAtTail(val);
return;
}
ListNode p = head;
ListNode s = new ListNode();
s.val = val;
for (int i = 0; i < index; i++) {
p = p.next;
}
s.next = p.next;
p.next = s;
size++;
}
public void deleteAtIndex(int index) {
if (index < 0 || index >= size) return;
ListNode p = head;
for (int i = 0; i < index; i++) {
p = p.next;
}
p.next = p.next.next;
size--;
}
}
class ListNode {
int val;
ListNode next;
public ListNode() {
}
public ListNode(int val, ListNode next) {
this.val = val;
this.next = next;
}
}
class Test {
public static void main(String[] args) {
MyLinkedList linkedList = new MyLinkedList();
linkedList.addAtHead(5);
linkedList.addAtIndex(1,2);
System.out.println(linkedList.get(1));
linkedList.addAtHead(6);
linkedList.addAtTail(2);
System.out.println(linkedList.get(3));
linkedList.addAtTail(1);
System.out.println(linkedList.get(5));
linkedList.addAtHead(2);
System.out.println(linkedList.get(2));
linkedList.addAtHead(6);
}
}
