链表
1.设计链表
题目网址:https://leetcode.cn/problems/design-linked-list/
你可以选择使用单链表或者双链表,设计并实现自己的链表。
单链表中的节点应该具备两个属性:val
和 next
。val
是当前节点的值,next
是指向下一个节点的指针/引用。
如果是双向链表,则还需要属性 prev
以指示链表中的上一个节点。假设链表中的所有节点下标从 0 开始。
实现 MyLinkedList
类:
MyLinkedList()
初始化MyLinkedList
对象。int get(int index)
获取链表中下标为index
的节点的值。如果下标无效,则返回-1
。void addAtHead(int val)
将一个值为val
的节点插入到链表中第一个元素之前。在插入完成后,新节点会成为链表的第一个节点。void addAtTail(int val)
将一个值为val
的节点追加到链表中作为链表的最后一个元素。void addAtIndex(int index, int val)
将一个值为val
的节点插入到链表中下标为index
的节点之前。如果index
等于链表的长度,那么该节点会被追加到链表的末尾。如果index
比长度更大,该节点将 不会插入 到链表中。void deleteAtIndex(int index)
如果下标有效,则删除链表中下标为index
的节点。
思路:
单链表,
1.设置一个虚节点,更方便对于增删的处理
2.设置size属性初始化为0,在增删方法中size++或–,这样可以知道链表长度从而简化代码过程
做题过程:
1.在设置MyLinkedList的属性时设置了两个节点dummy 和head。这样是head多设置了。
因为链表是从零开始添加,通过addAtHead对链表进行扩容,如果我们多设置一个head,head没有赋值,会多出一个无意义的节点
所以开始只需要设置一个dummy 虚节点即可
在addAtIndex()方法中出现很多问题,首先在判断index值时需要将他们用判断else-if连接,
不然如果符合index0或size后,size的值会发生改变,会导致下面的判断出现异常
3.对于add或delete方法,size增减的语句要放进if里面
Java代码:
class ListNode1{
int val;
ListNode next;
public ListNode1(){}
public ListNode1(int val){
this.val=val;
}
}
class MyLinkedList {
int size;
ListNode dummy;
public MyLinkedList() {
size=0;
//head=new ListNode();
dummy=new ListNode();
//dummy.next=head;
}
public int get(int index) {
if(index>=0 && index<=size-1){
ListNode cur=dummy.next;
while(index>0){
cur=cur.next;
index--;
}
return cur.val;
}else{
return -1;
}
}
public void addAtHead(int val) {
ListNode cur=dummy;
ListNode add = new ListNode(val);
add.next=cur.next;
cur.next=add;
size++;
}
public void addAtTail(int val) {
ListNode cur=dummy;
ListNode add = new ListNode(val);
while(cur.next!=null){
cur=cur.next;
}
cur.next=add;
size++;
}
public void addAtIndex(int index, int val) {
if(index==0) {addAtHead(val);}
else if(index==size){ addAtTail(val);}
else if(index>0 &index<=size-1){
ListNode add = new ListNode(val);
ListNode cur=dummy;
while (index>0){
cur=cur.next;
index--;
}
add.next=cur.next;
cur.next=add;
size++;
}
}
public void deleteAtIndex(int index) {
if(index>=0 &index<=size-1){
size--;
ListNode cur=dummy;
while (index>0){
cur=cur.next;
index--;
}
cur.next=cur.next.next;
}
}
@Override
public String toString() {
return "MyLinkedList{" +
"size=" + size +
", head=" + dummy.next +
'}';
}
}