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

移除链表元素

  • 一、移除链表元素
  • 二、链表的中间结点

一、移除链表元素

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在原链表中删除,这个思路说起来简单,做起来难!下面好好解析,怎么做,我是问的答疑老师,老师给我解惑,这一点特别感谢老师!!!
移除链表元素和链表的中间结点_第2张图片

/**
 * 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.题目.
移除链表元素和链表的中间结点_第3张图片
2.思路.
移除链表元素和链表的中间结点_第4张图片

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

完结!!!

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