LeetCode刷題進階之返回倒數第k個節點(面試題 02.02 )
阿新 • • 發佈:2021-01-21
技術標籤:LeetCode雙指標連結串列leetcodejava
一、題目
演示示例:
二、測試程式碼
//方法一
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public int kthToLast(ListNode head, int k) {
ListNode node= head.next;
int len=0;
while(node!=null)//遍歷得出連結串列長度
{
len++;
node=node.next;
}
int res=0;
for(int i=1;i<=len-k+1;i++)//設定一個指標走(n-k)步,定位到倒數第k個節點的位置
{
head=head.next;
}
res=head.val;//直接返回head的值val即可
return res;
}
}
//方法二 快慢指標
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public int kthToLast(ListNode head, int k) {
ListNode fast=head,slow=head;//初始化快慢指標都指向頭節點head
for(int i=0;i<k;i++)//快指標先向前走k步
{
fast=fast.next;
}
while(fast!=null)//雙指標每次都向前走一步,直至快指標走到連結串列尾節點跳出
{
fast=fast.next;
slow=slow.next;
}
return slow.val;
}
}
三、執行情況
方法一:
方法二:
四、刷題總結
方法一的主要思路:我們可以先遍歷統計連結串列長度len,然後遍歷連結串列,設定一個指標走(len-k+1)步(下標從1開始),即可找到連結串列倒數第k個節點,返回其val值即可。
方法二的主要思路:我們初始化快慢指標都指向頭節點head,快指標fast先向前走k步(結束後,雙指標fast和slow此時相距k步),然後雙指標共同移動每次都向前走一步,直至快指標fast走過連結串列尾節點時跳出(跳出時,慢指標slow與尾節點距離為k-1,即慢指標slow指向倒數第k個節點),返回slow指標的val值即可。
現以演示例項為例,連結串列為[1,2,3,4,5],返回連結串列倒數第2個節點,快指標先走2步即指向“2”,然後快指標和慢指標同時再走3步,快指標已到達尾節點“5”,慢指標已到達“3”。快慢指標再次向前走,即快指標指向null,慢指標指向“4”,此時返回慢指標的val值即可。