前言:
还是没坚持住每天更新一道算法题,自己不会的东西太多,每天都要看很多的东西来充实自己,所以也没有每天都刷算法题,今天正好看到了一道算法题,赶紧来实现一下。
题目描述
一个单链表,求出单链表中倒数第K个节点。
题目解析
这一道题其实挺简单的,首先能想到的一个办法就是使用遍历一遍链表长度,然后链表长度减去K加1就是倒数第K个节点。这种方法实现简单,但是时间复杂度会很高,因为第一次就遍了链表。所以可以采用第二种方法。这里设置两个指针p1、p2。p1指针想前先走K-1步,然后两个指针从头开始走,当p1指针到达尾部的时候,p2指针指向的节点就是倒数第K个节点。
代码样例
public class Node {
public Node next = null;
public int val;
public Node(int val)
{
this.val = val;
}
}
package com.asong.leetcode.ListAfterK;
public class Solution {
public static Node node(Node head,int k)
{
Node p1 = head; //用于第一个指针向前移动K-1
Node p2 = head; //用于第二个指针
if(k < 0 || head == null) //错误
{
return null;
}
//先将第一个节点走k-1步
for (int i = 1; i < k; i++) {
if(p1.next != null) //判断够不够k个节点
{
p1 = p1.next;
}else {
return null;
}
}
//两个指针开始同时移动
while(p1.next != null)
{
p1 = p1.next;
p2 = p2.next;
}
return p2;
}
}
package com.asong.leetcode.ListAfterK;
public class Main {
public static void main(String[] args) {
Node head = new Node(0);
head.next = new Node(1);
head.next.next = new Node(2);
head.next.next.next = new Node(3);
Node result = Solution.node(head,1);
System.out.println(result.val);
}
}