力扣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 

你可能感兴趣的:(数据结构,C语言,OJ,数据结构)