数据结构:链表经典算法OJ题

目录

前言

一、移除链表元素

二、反转链表

三、合并两个有序链表

四、链表的中间节点

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


前言

    在了解了链表的相关知识后,我们还需要一些题目进行练习加深对链表这方面知识的理解,也可以用来检测链表这块学的的怎么样,废话不多说,开始上手。

一、移除链表元素

    这里给上题目链接感兴趣的可以看一下(移除链表元素),

给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回新的头节点 。

数据结构:链表经典算法OJ题_第1张图片

 看题目描述,我们需要删除链表中链表节点为特定值的节点。

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

    首先,如果链表本身为空,就可以直接返回一个空指针,如果不为空就可以开始下一个阶段,先创建两个指针a,b指向开始给的头结点,让初始头结点开始遍历,如果遇到节点值为特定值就让b节点指向初始头结点的下一个,相当于跳过了这个节点,最后遍历完,如果b节点不为空,就将b的下一个节点置空,相当于是把那些带有特定值的节点删除了。

二、反转链表

    这里先给上题目链接(反转链表)

你可能感兴趣的:(数据结构,数据结构,链表,c语言)