移除链表元素和链表的中间结点

本文详细介绍了如何在链表中移除特定元素的两种方法,以及如何找到链表的中间结点。第一种方法是新建链表,第二种是遍历并直接删除。同时讨论了链表节点的内存分配和连接方式。
摘要由CSDN通过智能技术生成

一、移除链表元素

1.题目.
1
2.思路.
  思路1:很简单,最常规的方法,建立一个新的链表,头为newHead,遍历链表,不是val值的拿下来尾插,注意一些细节,比如,你拿一个节点的时候,你拿的这个节点里面存的是下一个节点的地址,可能在最后一个节点,后面还跟了其它节点,只要把最后一个节点里面的next置NULL就行,在就是特殊情况特殊处理,就能做好这个题。

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
 //首先明白:每一个节点是malloc开辟在堆区的一块空间
 //各个节点都是用指针连接起来的
 //每一个题只是要求每一个空间的连接方式不同
 typedef struct ListNode  ListNode;
struct ListNode* removeElements(struct ListNode* head, int val) {
    ListNode* pcur = head;  //pcur遍历链表
    ListNode* newHead = NULL;
    ListNode* newTail = NULL;
    while(pcur)
    {
        //找有用的节点
        if(pcur->val!=val)
        {
            if(newHead == NULL)
            {
                newHead = pcur;
                newTail = pcur;
            }
            else
            {
                //尾插
                //找到尾结点
                newTail->next =pcur;
                newTail = pcur;
            }
        }
        pcur = pcur->next;
    }
    //当pcur == NULL时,NULL没有放进最后一个节点
    //根据测试用例,[]
    //保证新链接的链表能至少链接一个节点
    if(newHead)
    {
        newTail->next = NULL;
    }
    return newHead;
}

  思路2:遍历一遍链表把val在原链表中删除,这个思路说起来简单,做起来难!下面好好解析,怎么做,我是问的答疑老师,老师给我解惑,这一点特别感谢老师!!!
1

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

struct ListNode* removeElements(struct ListNode* head, int val) {
    struct ListNode* tmp = (struct ListNode*)malloc(sizeof(struct ListNode));
    tmp->next = head;
    struct ListNode* cur = head;
    struct ListNode* prev  = tmp;
    while(cur)
    {
        if(cur->val==val)
        {
            prev->next = cur->next;
            cur = cur->next;
        }
        else{
            prev = cur;
            cur = cur->next;
        }
    }
    return tmp->next;
}

二、链表的中间结点

1.题目.
1
2.思路.
1

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode* middleNode(struct ListNode* head) {
    //此题分为两种情况
    //1.节点的个数为偶数  结束条件fast ==  NULL
    //2.节点的个数为奇数  结束条件fast->next == NULL
    //3.咱们要写的是循环条件
    struct ListNode* fast = head,*slow = head;
    //这儿在考虑一点,如果没节点和一个节点情况
    //这种情况满足
    while(fast&&fast->next)
    {
        fast = fast->next->next;
        slow = slow->next;
    }
    return slow;
}

完结!!!

  • 7
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值