首页 > 其他分享 >重生之“我打数据结构,真的假的?”--2.单链表

重生之“我打数据结构,真的假的?”--2.单链表

时间:2024-07-16 23:54:15浏览次数:21  
标签:单链 ListNode struct -- NULL next 链表 slow 真的假

1.单链表介绍(不带头节点)

1.1.链表的概念

概念:链表是一种物理存储结构上非连续、非顺序的存储结构,但链表在逻辑上是连续的,顺序的,而数据元素的逻辑顺序是通过链表中的指针连接次序实现的。

1.2.链表的结构

typedef struct SListnode
{
	datatype data;
	struct SListnode* next;
}SLnode;

2.力扣习题 

2.1——返回倒数第k个节点

. - 力扣(LeetCode)

1.设定两个指针p,q指向头节点;

2.p先移动k次;

3.p,q一起 移动,直至p->next==NULL;

返回q;

int kthToLast(struct ListNode* head, int k){
struct ListNode* p=head;
struct ListNode* q=head;
int i=k;
for(i=0;i<k;i++)
p=p->next;
while(p!=NULL)
{
    p=p->next;
    q=q->next;
}
return q->val;
}

2.2——链表的回文结构

链表的回文结构_牛客题霸_牛客网

1.设定两个指针,fast,slow;

2.在while(fast->next!=NULL&&fast->next->next!=NULL)下

fast走两步,slow走一步;

当循环停止时,slow为中间节点;

以测试样例为例:1->2->2->1

         slow指向第一个2;

3.slow->next之后的节点,依次前插至slow->next之前;

   1->2->1->2                       

4.slow=slow->next;指向1;

fast=head;指向头;

5.在slow指向NULL前

如果fast->data一直==slow->data;

则为回文结构;

class PalindromeList {
public:
    bool chkPalindrome(ListNode* A) {
        // write code here
       struct ListNode* fast=A;
     struct ListNode* slow=A;
    struct ListNode* flag=NULL;
    struct ListNode* arr=NULL;
    struct  ListNode* q=NULL;
    struct  ListNode* w=NULL;
    if(A->next==NULL)
     return true;
      while(fast->next!=NULL&&fast->next->next!=NULL)
      {
        fast=fast->next->next;
        slow=slow->next;
      }
      flag=slow->next;
      arr=flag->next;
      //q=arr->next;
        while(arr)
        {
            w=slow->next;
          q=arr->next;
          arr->next=NULL;
          slow->next=arr;
          arr->next=w;
          flag->next=q;
          arr=q;
        }
        fast=A;
        slow=slow->next;
        while(slow)
        {
            if(fast->val!=slow->val)
            return false;
            fast=fast->next;
            slow=slow->next;
        }
     return true;
    }
};

2.3——对链表进行插入排序

. - 力扣(LeetCode)

  1. 插入排序是迭代的,每次只移动一个元素,直到所有元素可以形成一个有序的输出列表。
  2. 每次迭代中,插入排序只从输入数据中移除一个待排序的元素,找到它在序列中适当的位置,并将其插入。(我使用的是原地算法,不用再malloc一个链表指针,不过比较麻烦(可恶))
  3. 重复直到所有输入数据插入完为止。

struct ListNode* insertionSortList(struct ListNode* head) {
    struct ListNode* p;
    struct ListNode* w;
    struct ListNode* q;
    struct ListNode* end=head;
    struct ListNode* flag;
    struct ListNode* t;
    p=head;
    q=p->next;
    while(q)
    {
        if(q->val<end->val)
        {
            w=q->next;
           end->next=q->next;
           flag=p;
           for(flag=p;((flag->val)<q->val)&&flag!=end;flag=flag->next);
            if (flag == p)
            {
                q->next = flag;
            }
            else
          {
            t = head;
            while (t->next != flag)
            t = t->next;
            q->next = flag;
            t->next = q;

          }
           if(q->next==head)
           {
             head=q;
             p=head;
           }
           q=w;
        }
        else
        {   
            end=end->next;
            q=q->next;
        }
    }
return head;






}

3.错题反思

链表分割

链表分割_牛客题霸_牛客网

1.原本想设定一个指针数组,记录所有小于x的节点地址;

然后依次连接;不知为何不行;

答案思路:

1.建立两个链表,要带有哨兵位!!!!

 greatHead = greattail = (struct ListNode*)malloc(sizeof(struct ListNode));

greattail用来移动和插入大于x的节点地址,greatHead用来记录头位置(greatHead->next是第一个节点)

2.同理,另一个链表记录小于x的节点,最后两者连接一下就ok力;(

lesstail->next = greatHead->next;  //链接less链表和geart链表

greattail->next = NULL;   //注意处理最后一个节点的原链接关系

struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) : val(x), next(NULL) {}
};*/
class Partition {
public:
    ListNode* partition(ListNode* pHead, int x) {
        // write code here
        //大体思路:创建两个链表,一个存储小于x的值,一个存储大于x的值,遍历原链表进行尾插。
        //创建哨兵卫
        struct ListNode* greatHead, *greattail, *lessHead, *lesstail, *cur;
        greatHead = greattail = (struct ListNode*)malloc(sizeof(struct ListNode));
        lessHead = lesstail = (struct ListNode*)malloc(sizeof(struct ListNode));
        cur = pHead;
         
        //遍历原链表进行尾插
        while(cur)
        {
            if(cur->val < x)
            {
                lesstail->next = cur;  //链接原链表头节点
                lesstail = cur;    //更新less链表尾节点
                cur = cur->next;  //原链表中cur继续更新往下走
            }
            else
            {
                greattail->next = cur;
                greattail = cur;
                cur = cur->next;
            }
        }
         
        lesstail->next = greatHead->next;  //链接less链表和geart链表
        greattail->next = NULL;   //注意处理最后一个节点的原链接关系
         
        return lessHead->next;
    }
};

 

标签:单链,ListNode,struct,--,NULL,next,链表,slow,真的假
From: https://blog.csdn.net/2301_80374809/article/details/140479312

相关文章

  • 第二期 prompt 工程
     这节课会带给你认识什么是prompt掌握提示工程的核心方法论,比99%的人达成更好效果掌握提示调优的基本方法,了解它在实际生产中的应用掌握防止Prompt注入的方法,AI更安全开始上课!一、什么是提示工程(PromptEngineering)提示工程也叫「指令工程」。Prompt(提示词)是一个指......
  • vLLM: Easy, Fast, and Cheap LLM Serving with PagedAttention
    vLLM:Easy,Fast,andCheapLLMServingwithPagedAttentionhttps://blog.vllm.ai/2023/06/20/vllm.htmlLLMspromisetofundamentallychangehowweuseAIacrossallindustries.However,actuallyservingthesemodelsischallengingandcanbesurprisingly......
  • 一起学RISC-V汇编第1讲之指令集架构
    准备写几篇学习笔记来讲述RISC-V汇编。1指令集架构指令集架构(InstructionSetArchitecture,简称ISA)是一种定义处理器体系结构的规范。定义了处理器能够执行的指令集、寄存器、编码格式、内存访问方式、中断、异常处理等细节。指令集:包含数条指令,每条指令都代表一个特定的操作......
  • 一起学RISC-V汇编第2讲RISC-V之march与mabi
    这一章讲一些RISC-V的一些零碎知识点,后面章节可能要用到这些概念。1RISC-V的各种扩展marchx86与arm是增量型ISA,意味着新处理器需要兼容过去所有的指令,这样会导致ISA指令随时间流逝而大幅增长。而RISC-V被设计为模块化的,这与过去几乎所有的ISA都不同,其核心是RV32I的基础ISA,......
  • CS229|Ch1|Linear regression
    Trainingset:\(\{(x^i,y^i);i=1,...,n\}\)\(x^i\in{X}\):input(features)\(y^i\in{Y}\):output(1)continuousvalues——Regression(2)discretevalues——ClassificationSupervisedlearning主要任务为找functionGivenatrainingset,learnafunction(hyp......
  • 第三期 Plugins & Function Calling
    大模型的缺陷:没有最新消息:训练周期长且昂贵,GPT3.5/4的知识截至2021-9没有真逻辑:表现出的逻辑和推理,是训练文本的统计规律,不是真正的逻辑Plugins订机票、数学计算、日程提醒...插件选择&使用插件的原理通过prompt判断是否应该调用插件失败使用门槛高:用户需要知道每......
  • 第四期 AI 编程
    目标如何用AI辅助编程,提升工作效率如何用AI快速应用和学习新技术,扩展职业边界通过AI编程,洞察AI对各个行业的影响趋势产品与技术的联通+业务视角=AI全栈工程师AI编程使用AI编程(编程目前是大模型能力最强的垂直领域),除了解决编程问题以外,更重要是建立AI意......
  • 一起学RISC-V汇编第3讲之寄存器
    寄存器是处理器中最常用的处理单元,RISC-V指令的操作数除了立即数就是寄存器。RISC-V指令集包含了多种不同类型的寄存器,用于不同目的和功能:对于rv32imafd架构而言,包含如下寄存器:通用寄存器:32个通用整数寄存器,分别标记为x0-x31,如果是fd扩展,还有32个独立的浮点寄存器,分别标记为f......
  • 找到两个数组中的公共元素
    leetcode2956https://leetcode.cn/problems/find-common-elements-between-two-arrays/一次遍历实现classSolution:deffindIntersectionValues(self,nums1:List[int],nums2:List[int])->List[int]:arr=[0]*110forninnums1:......
  • 【python】Enum 枚举类
    Enum枚举类[1]Enum是一组与互不相同的值分别绑定的符号名,类似于全局变量。因为枚举通常表示常量,所以建议枚举成员命名时采用大写。定义类定义classColor(Enum):#classsyntaxRED=1GREEN=2BLUE=3方法定义Color=Enum('Color',['RED','GRE......