本文主要讲解设计链表中的第一个问题:
int get(int index)
获取链表中下标为index
的节点的值。如果下标无效,则返回-1
。
c++和java代码如下,末尾
具体要点:
1.在最开始我们需要考虑一个边界条件,如果index是非法数值,那么就返回-1
index > (_size - 1) || index < 0
2.我们要获取某个节点的值时,核心操作是:
遍历链表,通过index--(直到等于0),来获取index位置的节点,返回其val
3.使用链表的常用操作:定义一个临时指针cur,使用cur进行链表遍历,而不是使用头节点head进行遍历(head指向的值不断变化,最后无法返回原先的头节点)
4.使用链表常用操作:定义一个虚拟头节点dummyHead(这一小问dummyHead作用不大)。
5.遍历条件,使用while循环,当index==0时,找到我们要的节点,停止遍历,如下
whlie(index){
cur = cur->next;
index--;
}
此时需要考虑清楚一个问题:
既然index==0是我们需要的值,那么开始遍历时,index的初始值对应的节点是哪个呢?
对于这类问题,解决办法是:考虑一下假设index是0的情况,即头节点的情况
假设index=0,我们需要返回头节点head的值。此时不进while循环,cur指向head,由于我们有dummyHead,所以开始时需要把cur指向dummyHead->next
cur = dummyHead->next // 即cur=head
c++代码
class MyLinkedList {
public:
// 定义链表节点结构体
struct LinkedNode {
int val;
LinkedNode* next;
LinkedNode(int val):val(val), next(nullptr){}
};
// 初始化链表
MyLinkedList() {
_dummyHead = new LinkedNode(0);
_size = 0;
}
// 获取到第index个节点数值,如果index是非法数值直接返回-1, 注意index是从0开始的,第0个节点就是头结点
int get(int index) {
if (index > (_size - 1) || index < 0) {
return -1;
}
LinkedNode* cur = _dummyHead->next; //cur指向原本头节点
while(index){
cur = cur->next;
index--;
}
return cur->val;
}
private:
int _size;
LinkedNode* _dummyHead;
};
java代码
class MyLinkedList {
//size存储链表元素的个数
int size;
//虚拟头结点
ListNode head;
//初始化链表
public MyLinkedList() {
size = 0;
head = new ListNode(0);
}
//获取第index个节点的数值,注意index是从0开始的,第0个节点就是头结点
public int get(int index) {
//如果index非法,返回-1
if (index < 0 || index >= size) {
return -1;
}
ListNode currentNode = head;
//包含一个虚拟头节点,所以查找第 index+1 个节点
for (int i = 0; i <= index; i++) {
currentNode = currentNode.next;
}
return currentNode.val;
}
}
学习自代码随想录