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

发布时间:2024年01月22日

一、移除链表元素

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;
}

完结!!!

文章来源:https://blog.csdn.net/2301_76821799/article/details/135729671
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。