1. 程式人生 > 其它 >LeetCode刷題進階之返回倒數第k個節點(面試題 02.02 )

LeetCode刷題進階之返回倒數第k個節點(面試題 02.02 )

技術標籤: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值即可。

類似題目:LeetCode刷題進階之連結串列中倒數第k個節點(劍指Offer 22)