链表中倒数第k个结点

链表中倒数第k个结点

http://www.nowcoder.com/questionTerminal/529d3ae5a407492994ad2a246518148a

图片说明


有三种方法:

  • 快慢指针解法
    倒数第k个节点,其实就是正数第n-k+1个节点。
    快指针先从head处往前走k-1步,慢指针全程不动,这样快指针走完k-1步后,它们的距离是k-1。
    当快指针走到链表最后一个元素时,二者停下。此时快指针总共走了n步,而慢指针跟它的距离还是k-1。所以慢指针走了n-(k-1)步,即n-k+1步。
public ListNode getKthFromEnd(ListNode head, int k) {
    ListNode first = head;
    ListNode second = head;
    //第一个指针先走k步
    while (k-- > 0) {
        first = first.next;
    }
    //然后两个指针在同时前进
    while (first != null) {
        first = first.next;
        second = second.next;
    }
    return second;
}

  • 栈解决
    这题要的是返回后面的k个节点,我们只要把原链表的结点全部压栈,然后再把栈中最上面的k个节点出栈即可。
    class Solution {
      public ListNode getKthFromEnd(ListNode head, int k) {
          Stack<ListNode> stack = new Stack<>();
          while(head != null){
              stack.push(head);
              head = head.next;
          }
          ListNode temp = null;
          while(k-- > 0){
              temp = stack.pop();
          }
          return temp;
      }
    }

  • 递归解决
    图片说明
    直接看代码就能懂
    public class Solution {
      int size;
      public ListNode FindKthToTail(ListNode head,int k) {
          //当空节点直接返回
          if(head == null)
              return head;
          //先递  往下传递
          ListNode node = FindKthToTail(head.next, k);
          //当往后返回时计算是k个时,直接返回当前head
          if(++size == k)
              return head;
          //再归 向上返回
          return node;
      }
    }
全部评论

相关推荐

12-18 22:04
已编辑
杭州电子科技大学 Java
程序员牛肉:我觉得是这样的,你现在有点病急乱投医了。你要问自己这样一个问题: 我找实习的目的是什么?为了挣钱还是增强个人实力?如果是为了挣钱那没得说,如果我是为了增强个人实习,那我异地去一个小厂实习真的有收益吗?这个收益是否大过我参加学校的项目或者自学?我记得你们杭电有那种实验室专门负责运维学校的项目的。 找实习只是一个手段而已,不要把他变成目的。不要病急乱投医。
实习简历求拷打
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务