链表问题_链表中倒数第K个节点

题目:输入一个链表,输出该链表中倒数第k个节点。尾节点为倒数第一个节点。
分析:可以采用两个指针,记为start和end,先让end在链表上走k-1步,然后两个节点同时开始走,当end到达尾节点时,start即为倒数第k个节点。这相当于做了一个长度为k的标尺一样,虽然很简单,但是在涉及到指针的操作时,一定要注意代码的鲁棒性,具体如下:

/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) :
            val(x), next(NULL) {
    }
};*/
  ListNode* FindKthToTail(ListNode*phead, unsigned int k)
  {
      if (phead == NULL || k == 0)
          return NULL;

      ListNode*p_start = phead;
      ListNode*p_end = phead;
      for (int i = 0; i < k-1; i++)
      {
          if (p_end->next)
              p_end = p_end->next;
          else
              return NULL;
      }

      while (p_end->next!=NULL)
      {
          p_start = p_start->next;
          p_end = p_end->next;
      }
      return p_start;
  }

说明:在这里函数的输入的参数k是一个无符号数,所以在判断输入是否合法时要判断k是否为0,因为一个无符号数0减去1之后值不是-1,而是0XFFFFFFFF,这样循环的次数无法预计。此外在里面使用指针时,一定要事先检查指针是否为空。

相关问题:
1、求链表的中间节点。如果链表中结点总数为奇数,返回中间节点;如果节点数为偶数,返回中间结点中的任一个。这里同样,我们可以使用两个指针,从链表的头部出发,一个指针走一步,另一个指针走两步。当走的快的指针到达链表末尾时,走的慢的指针刚好在链表中间。
2、判断一个单向链表中是否有环形结构。和前面问题一样,定义两个指针,同时从链表的头部出发,一个指针一次走一步,一个指针一次走两步。如果走的快的指针追上了走的慢的指针那么链表就是环形结构;如果走的快的指针走到了链表的末尾都没有追上走的慢的指针,那么就没有环形结构。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值