707设计链表
设计链表的实现。您可以选择使用单链表或双链表。单链表中的节点应该具有两个属性:val
和 next
。val
是当前节点的值,next
是指向下一个节点的指针/引用。如果要使用双向链表,则还需要一个属性 prev
以指示链表中的上一个节点。假设链表中的所有节点都是 0-index 的。
在链表类中实现这些功能:
-
get(index):获取链表中第
index
个节点的值。如果索引无效,则返回-1
。 -
addAtHead(val):在链表的第一个元素之前添加一个值为
val
的节点。插入后,新节点将成为链表的第一个节点。 -
addAtTail(val):将值为
val
的节点追加到链表的最后一个元素。 -
addAtIndex(index,val):在链表中的第
index
个节点之前添加值为val
的节点。如果index
等于链表的长度,则该节点将附加到链表的末尾。如果index
大于链表长度,则不会插入节点。如果index
小于0,则在头部插入节点。 -
deleteAtIndex(index):如果索引
index
有效,则删除链表中的第index
个节点。
示例:
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 库。
思路
-
由于我们有三个add方法,实现的逻辑都相同,我们就可以把其中的两个addhead,和addtail固定位置的方法都用addindex这样一个在任意位置添加节点的方法来表示
-
还是经典链表思路 -- 构造虚拟头节点,名字叫做dummynode,把它放在我们链表的第一位,来方便我们进行链表的头节点位置的删除
-
由于我们要删除一个节点,所以我们要停留在这个删除节点的前一位,在op.next = op.next.next
-
同理,这样在遍历的时候,我们也是停留在我们节点的前一位,这样如果要输出值,就要输出我们op.next的val;
代码如下
class MyLinkedList { int size = 0; LinkNode dummynode = new LinkNode(-1); LinkNode op = dummynode; public MyLinkedList() { } public int get(int index) { op = dummynode; if(index<0||index>=size) { return -1; } else { for(int i = 0;i<index;i++) { op = op.next; } return op.next.val; } } public void addAtHead(int val) { addAtIndex(0,val); } public void addAtTail(int val) { addAtIndex(size,val); } public void addAtIndex(int index, int val) { LinkNode s = new LinkNode(val); op = dummynode; if(index<0) { index = 0; } if(index>size) { return ; } if(dummynode.next == null) { dummynode.next = s; size++; }else{ for(int i = 0;i<index;i++) { op = op.next; } s.next = op.next; op.next = s; size++; } } public void deleteAtIndex(int index) { op = dummynode; if(index<0||index>=size) { return ; }else{ for(int i = 0;i<index;i++) { op = op.next; } op.next = op.next.next; size--; } } } class LinkNode{ int val; LinkNode next; public LinkNode(int val) { this.val = val; } }