0
点赞
收藏
分享

微信扫一扫

基于激光雷达的移动机器人室内AMCL定位点到点导航

江南北 2024-08-16 阅读 16

目录

题目1:返回倒数第k个结点

题目2:回文链表

题目3:相交链表


 

题目1:返回倒数第k个结点

d7c850c63ac54778879f2009b1115ab7.png

96c1c2bf094f4907ac72e29a2ddd7ae5.jpg

 代码:

typedef struct ListNode listnode; 
int kthToLast(struct ListNode* head, int k){
    listnode* slow,*fast;
    slow=fast=head;
    while(k)
    {
        fast=fast->next;
        k--;
    }
    while(fast)
    {
        slow=slow->next;
        fast=fast->next;
    }
    return slow->val;
}

同时,leetcode的测试用例中,并没有k大于链表结点数量的情况,因其保证了k是有效的。若k可能是无效的,在第一个while语句中加入限制条件即可。

9028ba4acda7430a99a4134884af3acb.png

 

题目2:回文链表

在继续本题的讲解之前,请先看本文:单链表leetcode刷题/上(C语言版)

后有大用!!!

a5332b7c091a444f9c747ff9459e0128.png

355a48e267714bedb537c880ec17785c.jpg

图1

3d5f9b384eb34d549166bcb912074f6d.jpg

图2

 代码:

 typedef struct ListNode listnode;
struct ListNode* middleNode(struct ListNode* head) {
    //快慢指针
    listnode* slow,*fast;
    //slow每次走一步,fast每次走两步
    slow=fast=head;
    while(fast&&fast->next)//是否可以反过来写?
    {
        slow=slow->next;
        fast=fast->next->next;
    }
    return slow;
}

struct ListNode* reverseList(struct ListNode* head) {
    if(head==NULL)
    {
        return NULL; //链表为空
    }
    else{
    listnode* n1,*n2,*n3;
    n1=NULL;
    n2=head;
    n3=head->next;
    while(n2)
    {
        n2->next=n1;
        n1=n2;//n1、n2同时往后走
        n2=n3;
        if(n3) 
        {
            n3=n3->next; //n3往后走
        }
    }
    return n1;//循环结束时,n1恰好指向结果链表的首元结点
    }
    }

bool isPalindrome(struct ListNode* head){
    listnode* mid = middleNode(head);
    listnode* rmid = reverseList(mid);
    while(head && rmid)
    {
        if(head->val != rmid->val)
        return false;
        head=head->next;
        rmid=rmid->next;
    }
    return true;
}

 

f21e2e6bfe46420f9faccb404e323d04.png

 

题目3:相交链表

d1b510151aa54bf4bf4cfda2db2d5c33.png

974d821214fe43f780e3d7a7e75a118f.png

4aaa8d80c40942a5b295f97c46bddf43.png

碰到该题可能出现的疑惑:

  • 为什么链表的相交只能是Y型状的,不能是X型状的?这是因为链表结点的next只能有一个结点,而X型的next则有两个结点,这已经不算是单链表了,因此不行。
  • 两个数值相等的结点为什么有些情况下不算相交?题设里已经明确表明,相交的判断不是通过数值,而是通过结点所指向的内存空间是否是同一块地方。所以判断语句应该是 结点与结点是否相等,而不是结点数值是否与结点数值相等。 

53ec13632f324f6f91782222fb677d4d.jpg

代码:

 typedef struct ListNode listnode;
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {
    listnode* curA,*curB;
    curA = headA,curB = headB;
    int lenA = 1,lenB = 1;
    while(curA->next)
    {
        curA = curA->next;
        lenA++;
    }
    while(curB->next)
    {
        curB=curB->next;
        lenB++;
    }

    if(curA != curB)
    return NULL;

    int gap = abs(lenA - lenB);
    listnode* longlist = headA,* shortlist = headB;
    if(lenB > lenA)
    {
        longlist = headB;
        shortlist = headA;
    }

    while(gap--)
    {
        longlist = longlist -> next;
    }

    while(longlist != shortlist)
    {
        longlist = longlist->next;
        shortlist = shortlist->next;
    }

    return shortlist;
}

 2a1cecfaca61421ea3174b5ed7621e82.png

 

 

举报

相关推荐

0 条评论