单链表的应用(3)

返回倒数第k个结点

实现一种算法,找出单向链表中倒数第 k 个节点。返回该节点的值。
在这里插入图片描述
思路:

  1. 利用快慢指针,先让快指针走k步
  2. 快慢指针一起往后遍历,直到快指针到达链表的末端
  3. 此时的慢指针就是链表的倒数第k个结点
int kthToLast(struct ListNode* head, int k)
{
    struct ListNode* slow=head;
    struct ListNode* fast=head;
    while(k--)
    {
        fast=fast->next;
    }//快指针先走k步
    while(fast)
    {
        slow=slow->next;
        fast=fast->next;
    }//快慢指针同时进行遍历
    return slow->val;
}

链表的回文结构

对于一个链表,请设计一个时间复杂度为O(n),额外空间复杂度为O(1)的算法,判断其是否为回文结构。给定一个链表的头指针A,请返回一个bool值,代表其是否为回文结构。保证链表长度小于等于900。
在这里插入图片描述
思路:

  1. 利用快慢指针寻找中间结点
  2. 将中间结点之后的结点进行倒置
  3. 从链表的两端进行遍历,判断结点是否相等,直到尾结点遍历到NULL
class PalindromeList {
public:
    ListNode* FindMid(ListNode* A)
    {
        ListNode* slow=A;
        ListNode* fast=A;
        while(fast && fast->next)
        {
            slow=slow->next;
            fast=fast->next->next;
        }
        return slow;
    }//找中间结点

    ListNode* reverseList(ListNode* A)
    {
        ListNode* n1,*n2,*n3;
        n1=NULL;
        n2=A;
        n3=A->next;
        while(n2)
        {
            n2->next=n1;
            n1=n2;
            n2=n3;
            if(n3)
                n3=n3->next;
        }
        return n1;
    }//中间结点后的结点进行倒置

    bool chkPalindrome(ListNode* A) {
        ListNode* mid=FindMid(A);
        ListNode* right=reverseList(mid);
        ListNode*left=A;
        while(right)
        {
            if(left->val != right->val)
                return false;
            left=left->next;
            right=right->next;
        }
        return true;
    }//遍历判断是否为回文结构
};

相交结点

给你两个单链表的头节点 headAheadB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null
在这里插入图片描述
思路:

  1. 分别遍历两个链表,计算两个链表的长度
  2. 若两个链表长度不相等,则将长的链表走两个链表的差值,使两个链表在遍历时能够同时到达链表的末端
  3. 遍历两个链表,若两个链表相等时,则返回任意一个链表的该结点,若到两链表遍历结束都未出现相同结点,则返回NULL
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {
    struct ListNode *pcur1=headA;
    struct ListNode *pcur2=headB;
    int i=0;
    int j=0;
    while(pcur1)
    {
        i++;
        pcur1=pcur1->next;
    }
    while(pcur2)
    {
        j++;
        pcur2=pcur2->next;
    }//计算两个链表长度
    int gap=abs(i-j);
    struct ListNode *longlist=headA;
    struct ListNode *shortlist=headB;
    if(i < j)
    {
        longlist=headB;
        shortlist=headA;
    }
    while(gap--)
    {
        longlist=longlist->next;
    }//找长链表,并将长链表走两个链表之间的差值
    while(longlist && shortlist)
    {
        if(longlist == shortlist)
            return longlist;
        longlist=longlist->next;
        shortlist=shortlist->next;
    }//遍历链表,相同则返回该链表,不相同继续遍历
    return NULL;
}

相关推荐

  1. linux2

    2024-07-21 11:34:01       55 阅读
  2. 数据结构3实现

    2024-07-21 11:34:01       32 阅读
  3. 删除

    2024-07-21 11:34:01       56 阅读
  4. 查询

    2024-07-21 11:34:01       27 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-21 11:34:01       52 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-21 11:34:01       54 阅读
  3. 在Django里面运行非项目文件

    2024-07-21 11:34:01       45 阅读
  4. Python语言-面向对象

    2024-07-21 11:34:01       55 阅读

热门阅读

  1. 【笔记-软考】架构演化

    2024-07-21 11:34:01       17 阅读
  2. 每天一个数据分析题(四百三十九)- 用户画像

    2024-07-21 11:34:01       17 阅读
  3. SpinalHDL之总线

    2024-07-21 11:34:01       15 阅读
  4. C# 中的事件

    2024-07-21 11:34:01       18 阅读
  5. 【分布式存储系统HDFS】架构和使用

    2024-07-21 11:34:01       17 阅读
  6. sugarhosts优惠码,国外免备案建站解决方案!

    2024-07-21 11:34:01       14 阅读
  7. SparseArray 你不知道的东西

    2024-07-21 11:34:01       16 阅读
  8. Python面试题:Python中的记忆化与缓存技术

    2024-07-21 11:34:01       16 阅读
  9. nginx的配置

    2024-07-21 11:34:01       14 阅读
  10. Choosing The Commander

    2024-07-21 11:34:01       19 阅读
  11. 测试人员如何进行需求分析

    2024-07-21 11:34:01       18 阅读
  12. 设计模式--模板方法

    2024-07-21 11:34:01       17 阅读
  13. 使用winget安装git

    2024-07-21 11:34:01       20 阅读