力扣OJ题感悟——链表篇

链表OJ题对于我现阶段的学习确实存在这一些难度,对题目里所蕴含的知识也是很浅,但我愿意分享我的一些理解,记录我的学习过程,也时常以博客来反省自己,提醒自己。
后续我会根据自己的学习情况补充OJ题思路和解法。
1.移除链表元素
代码如下:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
 
struct ListNode* removeElements(struct ListNode* head, int val)
{
   
    if(head==NULL)
    {
   
        return head;
    }
    struct ListNode* pre=NULL;
    struct ListNode* cur=head;
    while(cur)
    {
   
        if(cur->val==val)
        {
   
            struct ListNode* next=cur->next;
            if(pre==NULL)
            {
   
                head=next; 
            }
            else
            {
   
                pre->next=next;
            }
            free(cur);
            cur=next;
        }
        else
        {
   
            pre=cur;
            cur=cur->next;
        }
    }
        return head;
}

思路分析:要移除带头单链表所有符合要求的结点,首先要判断头指针是否为空。之后定义三个结点指针变量pre(指向前趋结点指针),cur(指向当前结点指针)和next(指向后继结点指针),用这三个变量进行操作。在函数实现中无非两种大情况:一种是cur指针指向的结点的符合条件,另一种则是不符合。判断这两个条件的前提则是cur指针的指向是否是空。为了保证下一个结点可以被找到,先把下一个结点保存,如果头指针指向的结点就是要移除的结点,那么必须让下一个结点变为头结点。
如果头结点不是要移除的元素,则将下一个节点覆盖到当前当前结点,即移除了当前结点,最后cur指针指向下一个结点。如果当前结点不是要移除的结点,那么pre、cur和next指针都向后移动一个结点。最后返回头指针head。

2.反转链表
代码如下:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode* reverseList(struct ListNode* head)
{
   
    struct ListNode* newhead=NULL;
    struct ListNode* cur=head;
    if(head==NULL)
    {
   
        return 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值