【数据结构】2.2经典的单链表练习题

 

目录

1. 删除链表中等于给定值 val 的所有节点。

 方法一:哨兵结点

方法二:尾插法

2.反转单链表

方法一:指针转方向

方法二:头插法

3.链表的中间结点

方法一:计算链表长度

方法二:快慢指针

4.合并有序单链表

5.链表的分割

6.带环问题(判断链表是否带环)

7.求环的入口点

8.复杂链表的复制


一些命名的介绍

cur:当前结点

prev:前继结点

next:后继结点

1-5题单链表的经典例题

6-8题单链表的带环问题

1. 删除链表中等于给定值 val 的所有节点。

题目分析:

 方法一:哨兵结点

 

 

本题用的方法是在head前设一个新的结点 给prev head的位置给cur

/**
 * 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 *sentinel =(ListNode*)malloc(sizeof(ListNode));//开辟一个哨兵结点
    sentinel->next = head;//让哨兵结点指向head
    ListNode *cur = head; //cur指向head
    ListNode *prev = sentinel;//prev指向哨兵结点
    while (cur != NULL)
    {
        if (cur->val == val)//当cur中的值 = 输入的值时 进入循环
        {
            prev->next = cur->next;//让prev指向next;
        } 
        else
        {
            prev = cur;//将prev移动到cur的位置
        }
        cur = cur->next;//cur移动到下一个位置
    }
    head = sentinel->next ; 
    free(sentinel);//新开辟的空间最后要free一下 防止内存泄漏
    return head;
}

方法二:尾插法

 

/*  Definition for singly-linked list.
 *  struct ListNode 
    {
 *     int val
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值