快慢指针求倒数第K个链表元素

快慢指针法解决链表倒数第K个结点的问题。
快慢指针在链表中经常用到,是一种非常常见的算法。其中,快慢指针可以用来求解链表的倒数第K个结点。
方法如下:(假设当前链表的长度m,要求倒数第k个链表结点)
①首先建立两个指针引用,分别为slow,fast。一开始都为head头结点
②fast指针移动k-1次,此时fast指针位于链表的第k个结点位置处。
③fast与slow指针同时向后移动,当fast指针指向链表末尾时,slow指针位于链表倒数第k个位置处。
算法原理:
fast指针位于第k个结点后,再次移动m-k次到达链表的最后一个结点。此时,slow与fast移动速度相同,则slow也移动了m-k次,那么slow到了链表的第m-k+1个结点处,显而易见m-k+1即为倒数第k个结点。
下面给出算法实现例子:
删除倒数第K个结点(LeeTCode19)
Given a linked list, remove the n-th node from the end of list and return its head.

Example:

Given linked list: 1->2->3->4->5, and n = 2.

After removing the second node from the end, the linked list becomes 1->2->3->5.
Note:

Given n will always be valid.

Follow up:
Could you do this in one pass?
题目很简单,就是删除链表的倒数第K个结点。转换一下,就是先求出倒数第K+1个结点temp,然后再删除就可以了。
这里要注意:需要先判断是否删除的是第一个结点,如果删除第一个直接返回head->next就可以啦。
代码如下:

class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) {
        ListNode* fast=head;
        ListNode* slow=head;
        int len=0;
        for(slow;slow!=NULL;slow=slow->next)
            len++;
        if(n==len)
            return head->next;
        slow=head;
        n=n+1;
        for(int i=0;i<n-1;i++)
            fast=fast->next;
        while(fast->next!=NULL)
        {
            slow=slow->next;
            fast=fast->next;
        }
        slow->next=slow->next->next;
        return head;
    }
};
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值