在链表类中实现这些功能:
- get(index):获取链表中第 index 个节点的值。如果索引无效,则返回-1。
- addAtHead(val):在链表的第一个元素之前添加一个值为 val 的节点。插入后,新节点将成为链表的第一个节点。
- addAtTail(val):将值为 val 的节点追加到链表的最后一个元素。
- addAtIndex(index,val):在链表中的第 index 个节点之前添加值为 val 的节点。如果 index 等于链表的长度,则该节点将附加到链表的末尾。如果 index 大于链表长度,则不会插入节点。如果index小于0,则在头部插入节点。
- deleteAtIndex(index):如果索引 index 有效,则删除链表中的第 index 个节点。
示例:
MyNode myNode = new MyNode();
MyNode.addAtHead(1);
MyNode.addAtTail(3);
// 链表变为1->2->3
MyNode.addAtIndex(1, 2);
// 返回3
MyNode.get(2);
// 现在链表为1->2
MyNode.deleteAtIndex(2);
MyNode.printNode();
代码:
public class MyNode {
private static int size;
private static Node dummyHead;
public MyNode() {
size = 0;
dummyHead = new Node(-1);
}
// 获取到第index个节点数值,如果index是非法数值直接返回-1, 注意index是从0开始的,第0个节点就是头结点
public static int get(int index) {
if (index < 0 || index > size -1) {
return -1;
}
Node cur = dummyHead.next;
while (index-- > 0) {
cur = cur.next;
}
return cur.val;
}
// 在链表最前面插入一个节点,插入完成后,新插入的节点为链表的新的头结点
public static void addAtHead(int val) {
Node newNode = new Node(val);
newNode.next = dummyHead.next;
dummyHead.next = newNode;
size++;
}
// 在链表最后面添加一个节点
public static void addAtTail(int val) {
Node newNode = new Node(val);
Node cur = dummyHead;
while (cur.next != null) {
cur = cur.next;
}
cur.next = newNode;
size++;
}
// 在第index个节点之前插入一个新节点,例如index为0,那么新插入的节点为链表的新头节点
public static void addAtIndex(int index, int val) {
Node newNode = new Node(val);
Node cur = dummyHead;
while (index-- > 0) {
cur = cur.next;
}
newNode.next = cur.next;
cur.next = newNode;
size++;
}
// 删除第index个节点,如果index 大于等于链表的长度,直接return,注意index是从0开始的
public static void deleteAtIndex(int index) {
if (index < 0 || index > size - 1) {
return;
}
Node cur = dummyHead;
while (index-- > 0) {
cur = cur.next;
}
cur.next = cur.next.next;
size--;
}
// 打印链表
public static void printNode() {
Node cur = dummyHead;
while (cur.next != null) {
System.out.println(cur.next.val);
cur = cur.next;
}
}
public static void main(String[] args) {
MyNode myNode = new MyNode();
MyNode.addAtHead(1);
MyNode.addAtTail(3);
MyNode.addAtIndex(1, 2);
MyNode.get(2);
MyNode.deleteAtIndex(2);
MyNode.printNode();
}
static class Node {
int val;
Node next;
public Node() {
}
public Node(int val) {
this.val = val;
}
public Node(int val, Node next) {
this.val = val;
this.next = next;
}
}
}