一、题目

二、题目分析
1.第一种解法:遍历两次,第一次遍历求出链表长度,第二次遍历找到k 个节点,为什么要怎么做:本题中的链表是单向链表,单向链表的节点只有从前往后的指针而没有从后往前的指针;假设整个链表有n个节点,那么倒数第K个节点就是从头节点开始的第n-k个节点。
2.第二解法:双指针解法;快慢指针,fast的指针要先走k+1,slow的指针要再head的位置上,此时fast - slow = k ;所以两个指针分别都向链表后面走,当fast指向为空的时候,slow的位置就在k上,如何去实现?先让fast slow都在head上,然后让fast先走k+1的节点
三、代码
/** * Definition for singly-linked list. * function ListNode(val) { * this.val = val; * this.next = null; * } */ /** * @param {ListNode} head * @param {number} k * @return {ListNode} */ var getKthFromEnd = function(head, k) { let p = head; let sum =0; //计算链表长度 while(p){ p = p.next; sum ++; } p = head; for(let i = 0; i < sum-k; i++){ p = p.next; } return p; };
/** * Definition for singly-linked list. * function ListNode(val) { * this.val = val; * this.next = null; * } */ /** * @param {ListNode} head * @param {number} k * @return {ListNode} */ var getKthFromEnd = function(head, k) { let fast = head, slow = head; while(fast && k){ fast = fast.next; k--; } while(fast){ fast = fast.next; slow = slow.next; } return slow; };
浙公网安备 33010602011771号