/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
func getKthFromEnd(head *ListNode, k int) *ListNode {
var fast *ListNode = head
var slow *ListNode = head
var i int = 0
for i < k {
fast = fast.Next
i++
} //快指针先走k步
for fast != nil {
fast = fast.Next
slow = slow.Next
}
return slow
}
# 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
"""
if head is None:
return head
fast = slow = head
for i in range(k): # 判断k是否大于链表的长度
if fast is None:
return None
fast = fast.next
while fast is not None:
fast = fast.next
slow = slow.next
return slow
# 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:
if head == None:
return None
fast = slow = head
while k>0:
fast = fast.next
k -= 1
while fast:
fast, slow = fast.next, slow.next
return slow
class Solution:
def getKthFromEnd(self, head: ListNode, k: int) -> ListNode:
fast = head
slow = head
while k > 1:
if fast.next is not None:
fast = fast.next
k = k-1
else:
break
while fast.next is not None:
fast = fast.next
slow = slow.next
return slow
/**
快节点先走k步后,慢节点再出发,
当快节点走到末尾最后一个节点时,慢节点指向的就是倒数第k个节点
*/
func getKthFromEnd(head *ListNode, k int) *ListNode {
if head nil {
return head
}
slow := head
fast := head
for ; k>0; k -- {
if fast == nil {
return fast
} else {
fast = fast.Next
}
}
for fast != nil {
slow = slow.Next
fast = fast.Next
}
return slow
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) {
fast = fast.next;
slow = slow.next;
}
return slow;
}
}
class Solution {
public ListNode getKthFromEnd(ListNode head, int k) {
ListNode pre = head, back = head;
while(k !=0 ){
back = back.next;
k--;
}
while(back != null){
pre = pre.next;
back = back.next;
}
return pre;
}
}
class Solution(object):
def getKthFromEnd(self, head, k):
“””
:type head: ListNode
:type k: int
:rtype: ListNode
“””
if head == None:
return None
former = head
latter = head
for i in range(k):
former = former.next
i +=1
while former != None:
if former.val == None:
return latter
former = former.next
latter = latter.next
return latter
func getKthFromEnd(head *ListNode, k int) *ListNode {
//双指针
right := head
left := head
//右指针先于左指针k个节点
for i := 0; i < k; i++ {
right = right.Next
}
//右指针到达链表尾,则左指针所在节点为倒数第k个节点
for right != nil {
right = right.Next
left = left.Next
}
return left
}
class Solution {
public:
ListNode* getKthFromEnd(ListNode* head, int k) {
if(!head){
return head;
}
auto dummy = new ListNode(-1);
dummy -> next = head;
int i = 0;
auto p = dummy;
while(i < k){
p = p -> next;
i++;
}
auto q = dummy;
while(p){
q = q -> next;
p = p -> next;
}
return q;
}
};
class Solution {
public ListNode getKthFromEnd(ListNode head, int k) {
ListNode former = head;
ListNode latter = head;
for (int i = 0; i < k; i++){
former = former.next;
}
while (former != null){
former = former.next;
latter = latter.next;
}
return latter;
}
}
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
func deleteNode(head *ListNode, val int) *ListNode {
dummy := &ListNode{
Next: head,
}
cur := dummy.Next
pre := dummy
for cur != nil{
if cur.Val == val{
pre.Next = cur.Next
break
}
pre = cur
cur = cur.Next
}
return dummy.Next
}
class ListNode:
def __int__(self, x):
self.val = x
self.next = None
class Solution:
def getKthFromEnd(self, head, k):
# 使用快慢双指针的方法
# 初始化, 前后指针都指向头节点
former = head
latter = head
# 前指针先走k步, 这样前后指针就间距k个节点
for _ in range(k):
if not former:
return
former = former.next
# 前后指针共同移动, 直到前指针走过链表的尾节点
while former:
former = former.next
latter = latter.next
return latter
"""
时间复杂度:O(N), N为链表长度
空间复杂度:O(1)
"""
class Solution {
public ListNode getKthFromEnd(ListNode head, int k) {
ListNode A = head, B = head;
for(int i = 0; i< k; i++){
A = A.next;
}
while(A != null){
A = A.next;
B = B.next;
}
return B;
}
}
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
func getKthFromEnd(head *ListNode, k int) *ListNode {
if head == nil {return head}
fast, slow := head, head
for i := 1; i <= k; i++ {
fast = fast.Next
}
for fast != nil {
fast = fast.Next
slow = slow.Next
}
return slow
}
共以下 74 个回答
【链表中倒数第k个节点】C++
打卡
打卡
打卡
快的先走k,然后再一起走。
时间复杂度:O(n)
空间复杂度:O(1)
利用快慢指针解决问题
快指针先走K,慢指针从第一个开始,当慢指针到达链表尾部,快指针就在倒数第K个节点
O(n), O(1)
“`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 slow=head;
ListNode quick=head;
int n=0;
while(n
/**
快节点先走k步后,慢节点再出发,
当快节点走到末尾最后一个节点时,慢节点指向的就是倒数第k个节点
*/
func getKthFromEnd(head *ListNode, k int) *ListNode {
if head nil {
return head
}
slow := head
fast := head
}
打卡:
class Solution {
public:
ListNode* getKthFromEnd(ListNode* head, int k) {
ListNode* l1 = head;
ListNode* l2 = head;
for(int i = 0; i < k;i++){
l1 = l1->next;
}
while(l1){
l1 = l1->next;
l2 = l2->next;
}
return l2;
}
};
时间复杂度 O(n)空间复杂度 O(1)”’C++
//打卡
class Solution {
public:
ListNode* getKthFromEnd(ListNode* head, int k) {
ListNode *pre = head;
ListNode *tmp = head;
for(int i = 0;i < k;++i){
tmp = tmp->next;
}
while(tmp != nullptr){
pre = pre->next;
tmp = tmp->next;
}
return pre;
}
};
”’
public ListNode getKthFromEnd(ListNode head, int k) {
//经典双指针
ListNode fast =head;
ListNode slow =head;
int a =1;
while(a<k)
{
a++;
fast=fast.next;
}
while(fast.next!=null)
{
fast=fast.next;
slow=slow.next;
}
return slow;
}
“`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) {
//两个指针,第一个先走k,然后一起走,第一个到底,第二个返回的就是倒数的了
ListNode first = head;
ListNode laster = head;
for(int i=1;i<=k;i++) laster = laster.next; while(laster != null) { laster = laster.next; first = first.next; } return first; } }
打卡
时间复杂度:O(N)
空间复杂度:O(1)
快慢指针
估计也就我用TS写了
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
“””
时间复杂度O(n)
空间复杂度O(1)
代码如下
第一天第二题
代码如下:
代码如下
快慢指针,先让快指针走k次,然后判断fast是不是空,若不是的话就slow和fast一起走一次
c++ 代码 ,快慢指针法
class Solution {
public:
ListNode* getKthFromEnd(ListNode* head, int k) {
ListNode* pre=head;
ListNode* follow=head;
for(int i=0;i<k;i++)
pre=pre->next;
while(pre)
{
pre=pre->next;
follow=follow->next;
}
return follow;
}
};
双指针打卡
方法是双指针中的快慢指针。具体如下:
1. 先让快指针往前走k步。
2. 再让快慢指针同时走,直至快指针指向为null
3. 此时慢指针就会到达倒数第k个节点,返回即可
时间复杂度:O(n)
空间复杂度:O(1)
快慢指针
空间O(1)
时间O(n)
快慢指针,当fast指向null的时候,slow指向的位置就是倒数第k个节点,fast和slow相差k个节点,才能保证fast指向nullslow指向倒数第k个节点
打卡剑指 Offer 22. 链表中倒数第k个节点
双指针法
/**
* 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;
while(k){
fast = fast->next;
k–;
}
while(fast->next != nullptr){
fast = fast -> next;
slow = slow -> next;
}
return slow;
}
};
获得倒数第n个结点,双指针。O(n)
c
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* getKthFromEnd(struct ListNode* head, int k){
struct ListNode *fast=head;
struct ListNode *slow=head;
if(head= = NULL) return NULL;
int i;
for(i=0;i<k;i++)
{
if(fast= = NULL) return NULL;
fast=fast->next;
}
while(fast!=NULL)
{
fast=fast->next;
slow=slow->next;
}
return slow;
}
//时间复杂度:O(N)
//空间复杂度:O(1)
双指针,O(n)
java
代码
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;}
ListNode p1 = head;//快指针
ListNode p2 = head;//慢指针
for(int i = 0; i < k; i++){
if(p1 null){// k大于链表长度
return null;}
p1= p1.next;
}
while(p1 != null){//k<= 链表长度
p1 = p1.next;
p2 = p2.nextl
}
return p2;
}
}
//C++双指针实现
class Solution {
public:
ListNode* getKthFromEnd(ListNode* head, int k) {
if (head nullptr) {
};
时间复杂度:O(N)
空间复杂度:O(1)
第一天
java
public Node deleteNodek(Node head,int k ){
Node p,q;
p=head;
q=head;
for (int i=0;i<k;i++){
p=p.next;
}
while (p.next!=null){
p=p.next;
q=q.next;
}
return q;
}
时间复杂度O(n)
空间复杂度O(1)
时间复杂度: O(n)
Space: O(1)
代码
Day1:下面是代码
#双指针
以下是代码
时间复杂度O(n)
空间复杂度O(1)
1.使用快慢双指针,快指针先走k步,之后快慢指针一起走,快指针为空时,返回慢指针的值
2.O(n),O(1)
时间复杂度:O(n)
空间复杂度:O(1)
“`java
class Solution {
public ListNode getKthFromEnd(ListNode head, int k) {
if(head == null) return null;
//快指针先移动k步
while(k > 0){
fast = fast.next;
k–;
}
//快慢指针一起移动
while(fast != null){
fast = fast.next;
slow = slow.next;
}
}
时间复杂度:O(n)
空间复杂度:O(1)
时间复杂度:O(n)
空间复杂度:O(n)
class Solution {
public ListNode getKthFromEnd(ListNode head, int k) {
ListNode fast = head;
ListNode slow = head;
}
class Solution {
public:
ListNode* getKthFromEnd(ListNode* head, int k) {
if(headNULL)return NULL;
ListNode* fast=head;
ListNode* slow=head;
for(int i=0;i<k;i++)
{
if(fastNULL)return NULL;
fast=fast->next;
}
while(fast!=NULL)
{
fast=fast->next;
slow=slow->next;
}
return slow;
}
执行用时:
4 ms
时间复杂度On
快慢指针,让快指针先走k步,慢指针在head,然后快慢一起走,那么快指针走到null时,慢指针就是倒数的第k个
比如 1 2 3 4 5,k等于2,刚开始快慢都在1.,然后快指针先走两步到3,两个一起走,当快指针走到5,慢指针走到3,快指针继续走到null,慢指针走到4,4就是所要的位置
时间复杂度On
空间复杂度O1
public ListNode getLastKListNode(ListNode head, int k) {
if (head null) return head;
ListNode slow = head;
ListNode fast = head;
for(int i = 0; i < k; i++) {
fast = fast.next;
}
while(fast != null) {
slow = slow.next;
fast = fast.next;
}
return slow;
}
}
时间复杂度:O(n)
空间复杂度:O(1)
时间复杂度:O(n)
空间复杂度:O(1)
时间复杂度:O(n)
空间复杂度:(O(1))
时间复杂度:O(n)
空间复杂度:O(1)