链表刷题-2

本文是链表刷题系列的第二部分,回顾上期内容并深入探讨索引无效的情况,包括index小于0、链表为空以及超出链表长度。文章通过分析链表遍历的方法,讨论如何利用计数器找到指定索引,并分享两种针对不同场景的链表操作写法。下期预告将结合动图和伪代码讲解更多链表插入情况。
摘要由CSDN通过智能技术生成

 先看完上一期再来看这一期

上一期回顾:https://blog.csdn.net/m0_53270064/article/details/127146073?spm=1001.2014.3001.5502

题目要求:

获取链表中第 index 个节点的值。如果索引无效,则返回-1。

首先我们需要分析索引无效的有哪些情况

  1. index<0

  2. 链表是空的 任何索引都无效

  3. 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;
}

 下期预告:链表学习第三阶段 动图演示+伪代码实现不同的插入情况...........................

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值