leetcode精选算法刷题训练篇 之 链表OJ(包含题目链接以及详细讲解)

在这里插入图片描述
好好学习,giao哥给你补🥚

1、移除链表元素

难度等级:⭐
题目链接:移除链表元素

2、链表的中间节点

难度等级:⭐⭐
题目链接:链表的中间节点

3、反转链表

难度等级:⭐⭐⭐
题目链接:反转链表

4、合并两个有序链表

难度等级:⭐⭐⭐⭐
题目链接:合并两个有序链表

5、分割链表

难度等级:⭐⭐⭐⭐⭐
题目链接:分割链表

6、环形链表的约瑟夫问题

难度等级:⭐⭐⭐⭐⭐⭐
题目链接:环形链表的约瑟夫问题

注:难度等级设置只是相对而言,仅供参考
–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–❀–

1、移除链表元素

题目链接:移除链表元素
题目:
在这里插入图片描述解题思路: 定义一个新链表,遍历原链表找到不为val的节点,尾插在新链表当中。
解题代码:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
typedef struct ListNode ListNode;

struct ListNode* removeElements(struct ListNode* head, int val) {
   
   
    ListNode* newTail,*newHead;
    newTail = newHead = NULL;
    ListNode* pcur = head;
    while(pcur)
    {
   
   
        if(pcur->val != val)
        {
   
   
           if(newHead == NULL)
           {
   
   
               newHead = newTail = pcur;
           }
           else
           {
   
   
               newTail->next = pcur;
               newTail = newTail->next;
           }
        }
        pcur = pcur->next;   
    }
    if(newTail)
    {
   
   
        newTail->next = NULL;
    }
    return newHead;
}

该题为接口性问题,我们只要知道单链表结构体类型,知道如何来解题即可。

代码讲解:
第一步我们需要创建两个结构体指针,分别用来标记新链表的头(newHead)和尾(newTail),对于所传过来的形参head保险起见一般是不能直接改他的值的,所以我们创建结构体变量pcur来代替head进行链表的遍历。
这里先强调一下只要进入while循环,那么就说明原链表不为空链表,之后就可以判定当pcur所指的节点val不等于所给的val时就要进行尾插,同时我们还需要考虑所创建的新链表是否为空,也就是是否已经插入了节点,因为当第一次向新链表插入节点时我们的头指针newHead和尾指针newTail都需要指向该节点,而之后如果继续插入的话只需要移动尾指针newTail即可,所以我们是需要考虑新链表是否为空的情况。
那么如果pcur所指的节点val等于所给的val时我们直接将pcur向前面的节点移动即可(pcur = pcur->next)。
完成上面操作后,要让大家自己写的话可能有人会直接返回头节点的指针就结束了,但这是不对的
在这里插入图片描述我们就拿上面的图为例,val = 6,那么当pcur移动到第7个节点(最后一个节点)的时候我们按照上面所讲的逻辑就会把第7个节点进行删除,但是第6个节点的next里面还存着第7个节点的地址,所以我们还需要把第6个节点的next改成指向NULL,也就是代码中的if(newTail),判断newTail是否为空,因为上面我们也提到过**“只要进入while循环,那么就说明原链表不为空链表”**,那么只要出了while循环就说明pcur已经是空指针了,而如果newTail不为空,就说新链表里面已经“存有”节点了,那么直接newTail->next = NU

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值