先看完上一期再来看这一期
上一期回顾:https://blog.csdn.net/m0_53270064/article/details/127146073?spm=1001.2014.3001.5502
题目要求:
获取链表中第 index 个节点的值。如果索引无效,则返回-1。
首先我们需要分析索引无效的有哪些情况
-
index<0
-
链表是空的 任何索引都无效
-
index超过了链表的长度
所以前两种我们在代码中体现
if(index < 0|| obj->next == NULL)
所以我们来重点考虑第三种情况
这里涉及到了一个重要的问题 链表的遍历
链表的遍历就是 一个一个节点的去找next 直到发现某个节点的next是NULL 就知道链表到头了
这里面我们利用while循环来做判断
while(List->next !=NULL){
List = List->next;
}
while(List!=NULL){
List = List->next;
}
两种判断方式的区别主要在:(停留的地方 进入的节点也不一样多)
1.要遍历链表 对其中每一个节点都访问到 并进行操作
这种场景的意思是
假设链表为1->2->3->4->5
要对每个节点都进行某个操作后 再退出循环
这种情况下 我们可以采用第二种方式 也就是最后List停在5后面的NULL节点上
这种情况下 节点5也会在循环里了 被操作到
2.遍历链表的目的是为了找到尾节点 对尾节点进行操作
这种场景的意思是
假设链表为1->2->3->4->5
要找到节点5并对他操作。
要对一个节点操作 呢我们必须停在他上面。
这种情况下要选择第一种 最终List停在5节点上面。我们就可以对他操作。
就是题目中的按index寻找。
这时候就需要引入一个新的变量,来记录我们现在处在链表的哪个位置。
但是通常在有些地方我们需要看index的位置
呢我们就需要一个计数器 来看我们遍历到哪个节点才找到对应的index
我们刚刚在上面学到的第一种情况 (对尾节点进行操作)就可以用在链表的尾插
void myLinkedListAddAtTail(MyLinkedList* obj, int val) {
/*初始化新节点*/
MyLinekedList *Node = (MyLinkedList*)malloc(sizeof(MyLinkedList));
Node->val = val;
Node->next = NULL;
/*不能改变obj本身的位置 所以我们创建一个新指针标记链表移动的当前临时位置*/
/*为啥不能改变obj的位置 因为它是虚假链表头 链表头是固定的不能随意变更 所以我们定义一个新的指针标记链表移动的位置
就算链表空了都没事 就算多追加了一个嘛在obj后面
*/
MyLinedList *nowList = obj;
while(nowList->next!=NULL){
nowList = nowList->next;
}
//找到尾节点以后 把它的next指向咋们新定义的节点
nowList->next = Node;
}
现在让我们回到第一个问题
1.当前链表的Node已经是NULL
2.链表当前不是NULL 但是当前的位置已经是到达index了
所以我认为有以下两种写法
以当前Node为NULL作为外面的循环终止条件,然后设置一个now作为计数器 从0开始直到到达index条件作为终止内循环;
int now = 0;
while(list != NULL){
if(now == index){
return list->val;
}
list = list->next;
now++;
}
循环结束后考虑 链表已经遍历完了 now都没有达到index 说明index无效 超过了链表
int now = 0;
while(now < index){
if(list == NULL) {
return -1;
}
list = list->next;
now++;
}
/**
now++后 实际当前我们的list我们不知道是不是NULL 必须判断一下 也就是当前的now位置的list 没有经过判断
*/
if(list != NULL){
return list->val;
}
return -1;
所以经过上面的思考
我将第一个问题的代码整理如下
获取链表中第 index 个节点的值。如果索引无效,则返回-1;
int myLinkedListGet(MyLinkedList* obj,int index){
if(index < 0||obj->next == NULL){
return -1;
}
int now = 0;
MyLinkedList *ListNow = obj->next;
while(now<index){
if(ListNow == NULL){
return -1;
}
ListNow = ListNow->next;
now++;
}
if(ListNow != NULL){
return ListNow->val;
}
return -1;
}
下期预告:链表学习第三阶段 动图演示+伪代码实现不同的插入情况...........................