链表中关于快慢指针的oj题

题目一:

给定一个头结点为 head 的非空单链表,返回链表的中间结点。

如果有两个中间结点,则返回第二个中间结点。

leetcode链接:力扣
 

解题思路:设定两个指针,一个是快指针,一个是慢指针。保持快指针的速度是慢指针的两倍,这样当快指针走到末尾的时候,慢指针刚好走到中间。返回慢指针。

如图:

 需要注意的是分奇偶讨论,while循环结束的条件有所不同。

代码:

class Solution {
public:
    ListNode* middleNode(ListNode* head) {
struct ListNode*slow=head,*fast=head;

while(fast&&fast->next)
{
    slow=slow->next;
    fast=fast->next->next;
}
return slow;
    }
};

题目二:求倒数第k个结点

题目描述:

输入一个链表,输出该链表中倒数第k个结点。

leetcode链接:链表中倒数第k个结点_牛客题霸_牛客网

思路:由于是求倒数第k个结点,因此就是求从尾结点开始倒数k-1步数的那个结点。可以定义两个指针。一个指针先走k-1步,另一个指针再开始走。等先走的指针走到了尾结点的时候,返回另一个指针就是要求得结点。

如图:

代码:

class Solution {
public:
    ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) {
    ListNode*slow=pListHead;
    ListNode*fast=pListHead;
        while(--k)//走k-1步
        {if(fast==NULL)
            return NULL;
         //如果k大于链表的长度 直接返回空
            fast=fast->next;
        }
        while(fast->next)//fast走到null结束
        {
            fast=fast->next;
            slow=slow->next;
        }
        
        return slow;
        
    }
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值