leetcode —— 简单链表题 C语言

leetcode —— 简单链表题 C语言,第1张

一 、1290. 二进制链表转整数

给你一个单链表的引用结点 head。链表中每个结点的值不是 0 就是 1。已知此链表是一个整数数字的二进制表示形式。

请你返回该链表所表示数字的 十进制值 。

int getDecimalValue(struct ListNode* head){
    struct ListNode *t=head;
    int a[100];
    int i=0;
    while(t!=NULL){
       i=i*2+t->val;
       t=t->next;
    }
    return i;
}

思路 :每次进到下个链表就将前面的*2,并加上当前val.

二、237. 删除链表中的节点

请编写一个函数,用于 删除单链表中某个特定节点 。在设计函数时需要注意,你无法访问链表的头节点 head ,只能直接访问 要被删除的节点 。

题目数据保证需要删除的节点 不是末尾节点 。

void deleteNode(struct ListNode* node) {
    struct ListNode*t;
    node->val=node->next->val;
    node->next=node->next->next;
}

思路:只需将当前的改成下一个的就行.

三 、剑指 Offer 24. 反转链表

定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。

struct ListNode* reverseList(struct ListNode* head){
    int a[10000];
    struct ListNode*t=head;
    int i=0;
    while(t){
        a[i++]=t->val;
        t=t->next;
    }
    t=head;
    for(int j=i-1;j>=0;j--){
        t->val=a[j];
        t=t->next;
    }
    return head;
}

思路:直接用一个数组记录数值 在反向给链表 

四 、1019. 链表中的下一个更大节点

给定一个长度为 n 的链表 head

对于列表中的每个节点,查找下一个 更大节点 的值。也就是说,对于每个节点,找到它旁边的第一个节点的值,这个节点的值 严格大于 它的值。

返回一个整数数组 answer ,其中 answer[i] 是第 i 个节点( 从1开始 )的下一个更大的节点的值。如果第 i 个节点没有下一个更大的节点,设置 answer[i] = 0 。

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


/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int* nextLargerNodes(struct ListNode* head, int* returnSize){
    struct ListNode *t=head;
    int i=0;
    int len=0;
    while(t){
        t=t->next;
        len++;
    }
    int* a = (int*)calloc(sizeof(int), len);
    t=head;
    while(t){
        a[i++]=t->val;
        t=t->next;
    }
    *returnSize=len;
    t=head;
    int b;
    for(int k=0;ka[k]){
                b=1;
                a[k]=a[j];
                break;
            }
        }
        if(b==0) a[k]=0;
    }
    return a;
}

思路:直接赋值给数组 再双指针进行找最大值 用b标记 没有找到就改为0。

五、328. 奇偶链表

给定单链表的头节点 head ,将所有索引为奇数的节点和索引为偶数的节点分别组合在一起,然后返回重新排序的列表。

第一个节点的索引被认为是 奇数 , 第二个节点的索引为 偶数 ,以此类推。

请注意,偶数组和奇数组内部的相对顺序应该与输入时保持一致。

你必须在 O(1) 的额外空间复杂度和 O(n) 的时间复杂度下解决这个问题。

struct ListNode* oddEvenList(struct ListNode* head){
    if(head==NULL){
        return head;
    }
        struct ListNode *p3=head->next;
        struct ListNode *p=head;
        struct ListNode *p2=p3;
        while(p2!=NULL && p2->next!=NULL){
            p->next=p2->next;
            p=p->next;
            p2->next=p->next;
            p2=p2->next;
        }
       p->next=p3;
        return head;
}

思路 :设三个链表分别为struct ListNode *p3=head->next;struct ListNode *p=head;
        struct ListNode *p2=p3;  在循环中首先将p->next指到p2->next->next 也就是第三个,

同理 将p=p->next,再将p2->next=p->next 最后再将p2改为p2->next.循环结束再将p和p2链接.

返回head.

六、725. 分隔链表

给你一个头结点为 head 的单链表和一个整数 k ,请你设计一个算法将链表分隔为 k 个连续的部分。

每部分的长度应该尽可能的相等:任意两部分的长度差距不能超过 1 。这可能会导致有些部分为 null 。

这 k 个部分应该按照在链表中出现的顺序排列,并且排在前面的部分的长度应该大于或等于排在后面的长度。

返回一个由上述 k 部分组成的数组。

 

输入:head = [1,2,3], k = 5
输出:[[1],[2],[3],[],[]]
解释:
第一个元素 output[0] 为 output[0].val = 1 ,output[0].next = null 。
最后一个元素 output[4] 为 null ,但它作为 ListNode 的字符串表示是 [] 。

struct ListNode** splitListToParts(struct ListNode* root, int k, int* returnSize) {
    *returnSize = k;
    struct ListNode** res = (struct ListNode**)calloc(k, sizeof(struct ListNode*));
    int n = 0;
    struct ListNode* cur = root;
    while (cur)
    {
        n++;
        cur = cur->next;
    }
    
    int split = n / k, last = n % k;
    int i = 0;
    if (split == 0)
    {
        while (last--)
        {
            res[i++] = root;
            cur = root->next;
            root->next = NULL;
            root = cur;
        }
    }
    else
    {
        while (k--)
        {
            res[i++] = root;
            for (int j = 0; j < split + (last > 0 ? 0 : -1); j++)
                root = root->next;
            last--;
            cur = root->next;
            root->next = NULL;
            root = cur;
        }
    }
    return res;
}

思路 :首先算出链表长度 再用长度进行(除k)算出每组个数 再%k 算出剩多少个 再判断如果每组==0 那么直接进行分组 没有元素的为NULL,当>0 循环k次 每次将split个 (根据题意 前面的更大 所以需要判断last不为0 那么可以将加一进去)。输入链表数组中时 每次需要将其地址切断 设为NULL。  

来自英雄哪里出来的指导

题源 :leetcode.

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1353124.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-14
下一篇2022-06-14

发表评论

登录后才能评论

评论列表(0条)

    保存