题目:输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。
例如,一个链表有 6 个节点,从头节点开始,它们的值依次是 1、2、3、4、5、6。这个链表的倒数第 3 个节点是值为 4 的节点。
示例:
给定一个链表: 1->2->3->4->5, 和 k = 2.
返回链表 4->5.
解题思路:
这道题其实最简单的方法,我觉得是用链表对原ListNode进行倒置,然后直接返回第k-1个值即可.
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode getKthFromEnd(ListNode head, int k) {
LinkedList<ListNode> list = new LinkedList<ListNode>();
//实现链表的倒置
while(head != null){
list.addFirst(head);
head = head.next;
}
//取出第k个值就是倒数第k个值
return list.get(k-1);
}
}
力扣战绩:
当然了还有另一种解题思路:(以下思路和代码不考虑修改传入的head节点的初始值,如果要保证原head不变,我们可以多写一个变量,执行该思路head的职责,并代替head返回。)
因为他要的是倒数第k个节点,那么他的长度必定大于等于k,所以
1、首先,我们可以先让一个temp节点等于head,然后让他执行k次等于他的next。
2、然后再让他从现在的节点走到完(temp == null),在这段循环中,我们让head每次也等于他的next,最后他走完的时候,head会刚好等于倒数第k个节点。我们返回head即可。
总结一句话,其实就是,总长度减掉倒数要走的长度,就会等于往前走的话,需要走多少步。
用小学的数学的角度来说就是,总长为len的公路,已知倒数k公里有个面包店,那么从头走过去len-k公里就会到达这个面包店。
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode getKthFromEnd(ListNode head, int k) {
ListNode temp = head;
for(int i = 0; i < k; i++)
temp = temp.next;
while(temp != null) {
temp = temp.next;
head = head.next;
}
return head;
}
}