
扫码关注微信公众号
回复“面试手册”,获取本站PDF版
回复“简历”,获取高质量简历模板
回复“加群”,加入程序员交流群
回复“电子书”,获取程序员类电子书
题目描述
输入一个链表,输出该链表中倒数第 k 个节点。为了符合大多数人的习惯,本题从 1 开始计数,即链表的尾节点是倒数第 1 个节点。
例如,一个链表有 6 个节点,从头节点开始,它们的值依次是 1、2、3、4、5、6。这个链表的倒数第 3 个节点是值为 4 的节点。
示例:
给定一个链表: 1->2->3->4->5, 和 k = 2.
返回链表 4->5.
题解
(双指针,快慢指针,一次扫描) O(n)
使用两个指针 first、second,先让 second 往后走 k 步,此时两个指针同时往后走,当 second 为空时,此时 first 指针指向的就是倒数第 k 个节点。
时间复杂度
O(n)
空间复杂度
O(1)
C++ 代码
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* getKthFromEnd(ListNode* head, int k) {
auto first = head, second = head;
for (int i = 0; i < k; i ++ ) second = second->next;
while (second) {
first = first->next;
second = second->next;
}
return first;
}
};
Java 代码
/**
* 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 first = head, second = head;
for (int i = 0; i < k; i ++ ) {
second = second.next;
}
while (second != null) {
first = first.next;
second = second.next;
}
return first;
}
}
Python 代码
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def getKthFromEnd(self, head: ListNode, k: int) -> ListNode:
first = head
second = head
for i in range(k):
second = second.next
while second is not None:
first = first.next
second = second.next
return first
本文由读者提供,Github地址:https://github.com/tonngw
点击面试手册,获取本站面试手册PDF完整版