/**
* 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) {
ListNode* x = head;
ListNode* y = head;
for (int i = 0; i < k; i ++){
x = x -> next;
}
while (x){
x = x -> next;
y = y -> next;
}
return y;
}
};
*/
打卡
class Solution:
def getKthFromEnd(self, head: ListNode, k: int) -> ListNode:
fast, slow = head, head
for i in range(k):
fast = fast.next
while fast != None:
fast = fast.next
slow = slow.next
return slow
class Solution(object):
def getKthFromEnd(self, head, k):
“””
:type head: ListNode
:type k: int
:rtype: ListNode
“””
first = head
second = head
for i in range(k-1):
first = first.next
while first.next:
first = first.next
second = second.next
return second
class Solution {
public ListNode getKthFromEnd(ListNode head, int k) {
ListNode p = head;
ListNode q = head;
for (int i = k; i > 1; i--) {
p = p.next;
}
while (p.next != null) {
p = p.next;
q = q.next;
}
return q;
}
}
# 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:
fast = head
slow = head
for i in range(k-1):
fast = fast.next
while fast.next != None:
fast = fast.next
slow = slow.next
return slow
共以下 46 个回答
打卡成功
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode trainingPlan(ListNode* head, int cnt) {
ListNode* former = head;
ListNode* latter = head;
while(cnt–)
{
former = former->next;
}
while(former != nullptr)
{
former = former->next;
latter = latter->next;
}
return latter;
}
};
使用双指针,两个指针初始化时间隔要求步数,然后同步移动,直到前面的指针先到链表末尾。
空间复杂度为O(1),时间复杂度为O(n).
用双指针
1.初始化:former, latter = head, head
2.构建双指针距离:former向前走k步
3.双指针共同移动:循环中,双指针每轮都向前走一步,直至former走过链表的尾节点跳出
4.返回值:latter
思路总结:
使用前后指针,前指针和后指针先相差k-1 个位置,然后让前指针和后指针同时向后移动,直到前指针的next指向空 则表明遍历完成,此时后指针指向的就是倒数第k个节点
//slow为定位的节点
//fast为鉴定整个循环
//先将fast设定到需要的倒数的节点 之后slow和fast指针同时移动 当fast到最后后退出 slow指向倒数的节点
//判断链表为空和循环链表和链表节点选择不正确和fast指针是否到达最后
if(head NULL)
{
return NULL;
}
ListNode fast=head;
ListNode slow = head;
for(int i =0;i<k-1;i++)
{
if(fast NULL)
{
return NULL;
}
fast = fast.next;
}
while(fast != NULL)
{
slow= slow.next;
fast = fast.next;
}
return slow;
/**
* 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) {
ListNode* cur0 = head;
ListNode* cur1 = cur0;
while(cur0 != nullptr)
{
int i = 0;
while(i<k)
{
if(cur1->next nullptr)
{
return cur0;
}
cur1 = cur1->next;
i++;
}
}
return cur0;
}
};
时间复杂度o(n)
空间复杂度o(1)
时间复杂度o(n),空间复杂度o(1)
class Solution {
public ListNode getKthFromEnd(ListNode head, int k) {
ListNode fast = head;
ListNode slow = head;
for(int i = 1; i <= k; i++){
fast = fast.next;
}
while(fast != null){
fast = fast.next;
slow = slow.next;
}
return slow;
}
}
事件复杂度o(n),空间复杂度o(1)
思路:使用快慢指针,让快指针先走k步,然后快慢指针一起走,直到快指针为nullptr,返回慢指针
/**
* 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) {
ListNode *slow, *fast;
fast = slow = head;
int count = 0;
while (fast != nullptr) {
if (count >= k) slow = slow->next;
fast = fast->next;
count++;
}
return slow;
}
};
思路:使用快慢指针,快指针先走k个节点,然后快慢指针一起走,当快指针为null时,慢指针指向倒数第k个节点
时间复杂度O(n),空间复杂度O(1)
class Solution {
public ListNode getKthFromEnd(ListNode head, int k) {
// 使用快慢指针,快指针先走k个节点,然后快慢指针一起走,当快指针为null时,慢指针就是指向倒数第k个节点
if(head null) {
return null;
}
ListNode fast = head, slow = head;
// 快指针先走k个节点
for(int i = 0; i < k; ++i) {
if(fast null) {
return null;
}
fast = fast.next;
}
// 快慢指针同时走,知道快指针为null
while(fast != null) {
fast = fast.next;
slow = slow.next;
}
return slow;
}
}
时间复杂度O(n)空间复杂度O(1)
思路:双指针
”’java
//单链表 删除倒数第K个节点
public class Solution {
public ListNode getKtnFromEnd(ListNode head, int k)
{
ListNode front = head;
ListNode behind = head;
for(int j=0; j<k; j++)
{
front = front.next;
}
while(front.next!=null)
{
front = front.next;
behind = behind.next;
}
return behind;
}
}
//首先是计算链表有多少节点
//其次将计算的count-k的值,就是尾节点的值。
//时间复杂度为o(n)
//空间复杂度为o(1)
class Solution {
public:
ListNode* getKthFromEnd(ListNode* head, int k) {
if(headNULL)
return head;
};
时间复杂度:o(m),空间复杂度o(1)
双指针法:
1、初始化两个指向头部的指针
2、第一个指针先移动k个结点;
3、两个指针开始同时按相同步长移动;
4、第一个指针到末尾时,同时停止两指针;
5、返回第二个指针的位置即是子串的前一个节点;(此处要求返回的就是子串头节点的前一个节点)
struct node *findNodeFromEnd(struct node * head, int num)
{
//判断头结点,或者n数字是不是正常
if(head NULL || n <=0)
{
return NULL;
}
}
时间复杂度O(n)
空间复杂度O(1)
快指针先走
两个意外情况 为空或不够k个节点
思路:双指针一个快指针一个慢指针,快指针先走k步,之后两者同时前进,当快指针走到最后时,慢指针指的即为所求。
时间复杂度:O(n)
空间复杂度:O(1)
/**
* 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) {
ListNode* fast=head;
ListNode* slow=head;
for(int i=0;i<k;i++){
fast=fast->next;
}
while(fast!=NULL){
slow=slow->next;
fast=fast->next;
}
return slow;
}
};
ListNode* getKthFromEnd(ListNode* head, int k) {
if(head nullptr){
return nullptr;
}
ListNode* forward = head;
ListNode* backward = head;
”’java class Solution {
public ListNode getKthFromEnd(ListNode head, int k) {
// 判断特殊情况
if(headnull){
return null;
}
ListNode fast=head,slow=head;
for(int i,i<k,i++){
//判断fast是否先走完
if(headnull){
return null;
}
fast=fast.next;
}
//fast 到达终点的时候,slow刚好在倒数的位置上
while(fast!=null){
fast=fast.next;
slow=slow.next;
}
return slow
}
}
过
“`cpp
class Solution {
public:
ListNode* getKthFromEnd(ListNode* head, int k) {
ListNode *s, *f;
s = f =head;
for(int i = 1; i <= k; i++){ if(f != nullptr){ f = f->next;
}
}
while(f != nullptr){
s = s->next;
f = f->next;
}
return s;
}
};
本题是经典的快慢指针,掌握即可,
主要注意的点还是遍历过程中需要不需要使用头结点,以及快指针应该到哪步停止,
容易走多一步,或者少走一步。
可以先用题中给的case作为测试。
#python题解:快慢指针,快慢指针先指向head,fast先走k步,然后fast&slow一起走,fast走到null时,就说明fast到尾部,即slow就是倒数第k个节点,直接输出slow。
#复杂度:时间复杂度O(n),空间复杂度O(1)
lass Solution(object):
def getKthFromEnd(self, head, k):
“””
:type head: ListNode
:type k: int
:rtype: ListNode
“””
if head is None:
return None
先计算出链表的长度,再根据k的值,让链表走len-k步
class Solution {
public:
ListNode* getKthFromEnd(ListNode* head, int k) {
if(head NULL){
return NULL;
}
ListNode *temp = head;
int len = 0;
while (temp != NULL) {
len++;
temp = temp->next;
}
for(int i=0; i<len-k; i++){
if(head NULL){
return NULL;
}
head = head->next;
}
return head;
}
};
时间复杂度O(n),空间复杂度O(1)
//1//shijian o(n),俩链表,latter先走k步,然后latter是否为空,不为空就latter=next;为空就return former;2//然后latter是否为空,不为空就latter和former同时->next;否则跳出,return former;
struct ListNode* getKthFromEnd(struct ListNode* head, int k){
if(head NULL)
{
return NULL;
}
struct ListNode *former=head;
struct ListNode *latter=head;
int i=0;
while(k>i){
if(latter->next!=NULL){
latter= latter->next;
// k–;
}
else{
return former;
// k–;
}
i++;
}
思路:双指针法,特殊处理只有一个节点的情况
时间复杂度O(n),空间复杂度O(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) {
if(head null)
return null;
}
打卡,简单题,快慢双指针。
时间O(n) 空间O1
时间复杂度:O(N),空间复杂度:O(N)
初始化两个节点,一个比另一个快k-1步,同时走
时间复杂度O(n)和空间复杂度O(1)
···python
Definition for singly-linked list.
class ListNode(object):
def init(self, x):
self.val = x
self.next = None
class Solution(object):
def getKthFromEnd(self, head, k):
“””
:type head: ListNode
:type k: int
:rtype: ListNode
“””
first = head
second = head
for i in range(k-1):
first = first.next
···
“`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:
tmp = head
cur = head
#暴力解法:倒数转换为正数,然后几个while循环
# i=0
打卡
直到快指針到鏈表尾, 這時返回慢指針就是答案
“`C++
class Solution {
public:
ListNode* getKthFromEnd(ListNode* head, int k) {
};
1.使用快慢指针指向链表头;
2.快指针先走k步,若过程中已经遍历完链表,则返回空;
3.快慢指针同时遍历链表,当快指针指向尾节点时结束遍历,返回慢指针;
“`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 *fast = head;
while (k–) {
if (fast nullptr) {
return nullptr;
}
fast = fast->next;
}
auto *slow = head;
while (fast != nullptr) {
fast = fast->next;
slow = slow->next;
}
return slow;
}
};
“`
//快慢指针,让快指针先跑k-1步,这时候再让快慢指针一块前进直到快指针的下一步为null
//慢指针所在的位置就是倒数第K个节点
class Solution {
public ListNode getKthFromEnd(ListNode head, int k) {
ListNode p = head;
ListNode q =head;
for(int i=k;i>1;i–){
p = p.next;
}
while(p.next != null){
p = p.next;
q = q.next;
}
return q;
}
}
/**
* 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) {
if (head NULL) return NULL; //head为空
};
1、快慢指针,快指针先移动k步,慢指针再开始移动
2、时间复杂度O(n),空间复杂度O(1)
采用快慢指针即可;
时间复杂度:O(n)
空间复杂度:O(1)
快慢指针
时间复杂度:O(n) ; 空间复杂度:O(1)
时间复杂度: O(n) 空间复杂度O(1)
快慢指针
时间O(n)空间O(1)