剑指 Offer 22. 链表中倒数第k个节点🌟🌟🌟🌟🌟中等

课后作业

问题描述

原文链接:剑指 Offer 22. 链表中倒数第k个节点

输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。

例如,一个链表有 6 个节点,从头节点开始,它们的值依次是 1、2、3、4、5、6。这个链表的倒数第 3 个节点是值为 4 的节点。

示例:

给定一个链表: 1->2->3->4->5, 和 k = 2.

返回链表 4->5.

代码实现

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) {
        if(head == null){
            return head;
        }

        ListNode slow = head;
        ListNode fast = head;

        for(int i = 0; i < k - 1; i++){
            fast = fast.next;
        }

        while(fast.next != null){
            fast = fast.next;
            slow = slow.next;
        }

        return slow;
    }
}

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
        """
        if head is None:
            return head

        slow = head
        fast = head

        for i in range(k - 1):
            fast = fast.next

        while fast.next is not None:
            fast = fast.next
            slow = slow.next

        return slow

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) {
        if(head == nullptr){
            return head;
        }

        ListNode* slow = head;
        ListNode* fast = head;

        for(int i = 0; i < k - 1; i++){
            fast = fast->next;
        }

        while(fast->next != nullptr){
            fast = fast->next;
            slow = slow->next;
        }

        return slow;
    }
};

Go

/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func getKthFromEnd(head *ListNode, k int) *ListNode {
    if head == nil {
        return head
    }

    slow := head
    fast := head

    for i := 0; i < k-1; i++ {
        fast = fast.Next
    }

    for fast.Next != nil {
        fast = fast.Next
        slow = slow.Next
    }

    return slow
}

发表回复

后才能评论

评论(11)

  • 我来吃饭啦 永久会员 2024年6月17日 下午4:48
    # Definition for singly-linked list.
    # class ListNode:
    #     def __init__(self, val=0, next=None):
    #         self.val = val
    #         self.next = next
    #  former比latter多走了cnt步
    class Solution:
        def trainingPlan(self, head: Optional[ListNode], cnt: int) -> Optional[ListNode]:
            latter = former = head
            for _ in range(cnt):
                if not former: return 
                former = former.next
            while former:
                latter = latter.next
                former = former.next
            return latter
    
  • fungible 永久会员 2024年5月30日 下午11:29

    求倒数第cnt个结点,用双指针,先让前一个指针跑cnt步,随后再一起跑,前一个指针跑到终点时,后一个指针就正好到了倒数第cnt个结点
    时间复杂度:O(n)
    空间复杂度: O(1)
    class Solution {
    public ListNode trainingPlan(ListNode head, int cnt) {
    ListNode p=head,q=head;
    while(q!=null){
    while(cnt>0){//先跑cnt步
    q=q.next;
    cnt–;
    }
    while(cnt0&&q!=null){
    p=p.next;
    q=q.next;
    }
    
    }
    return p;
    }
    }

  • Mr.肖 永久会员 2024年3月25日 下午8:56
    class Solution {
        public ListNode trainingPlan(ListNode head, int cnt) {
            //快慢指针
           //使用虚拟头节点,让fast指针先走k步,然后slow和fast同时走(slow从虚拟头结点出发),当fast走到null时
           //slow的位置就是倒数第k个结点
    
            ListNode dummy = new ListNode();
            dummy.next = head;
    
            ListNode slow = dummy;
            ListNode fast = dummy;
    
            for(int i = 0; i < cnt; i++){
                fast = fast.next;
            }
    
            while(fast != null){
                slow = slow.next;
                fast = fast.next;
            }
    
            return slow;
        }
    }
    
  • 周四 永久会员 2024年3月8日 上午10:52

    打卡

      public ListNode trainingPlan(ListNode head, int cnt) {
             if(head == null){
                 return head;
             }
             ListNode node = head;
             int  length = 0;//记录链表长度
             while(node != null){
                 length++;
                 node = node.next;
             }
    
            node = head;
            for(int i = 0 ; i < (length-cnt); i++){
                node = node.next;
            }     
            return node;
        }
    
  • 少年不识流川枫 永久会员 2024年2月27日 下午4:19

    打卡
    快指针走k-1步 ,用for
    之后慢和快各自走一步,直到快指针走到最后一个。

  • uu 永久会员 2023年9月19日 下午3:55
    / 【思路】单指针+遍历
    // 时间复杂度:O(n)
    // 空间复杂度:O(1)
    // class Solution {
    //     public ListNode getKthFromEnd(ListNode head, int k) {
    //         ListNode cnt = head;
    //         int count = 0;
    //         while(cnt != null) {
    //             count++;
    //             cnt = cnt.next;
    //         }
    //         count -= k;
    //         for(int i = 1; i <= count; i++) {
    //             head = head.next;
    //         }
    //         return head;
    //     }
    // }
    
    // 【思路】双指针(head)
    // 时间复杂度:O(n)
    // 空间复杂度:O(1)
    class Solution {
        public ListNode getKthFromEnd(ListNode head, int k) {
            ListNode sub = head;
            while(sub != null) {
                sub = sub.next;
                k--;
                if(k >= 0) {
                    continue;
                }
                head = head.next;
            }
            return head;
        }
    }
    
  • 泡芙 永久会员 2023年9月1日 下午4:32

    Time:O(n)
    Space:O(1)

    class Solution {
        public ListNode getKthFromEnd(ListNode head, int k) {
            if (head == null) {
                return head;
            }
    
            ListNode fast = head;
            ListNode slow = head;
    
            // fast比slow 多走k步
            for (int i = 0; i < k - 1; i ++) {
                // 如果fast.next==null,说明k>n
                if (fast.next == null) {
                    return head;
                }
                fast = fast.next;
            }
    
            while (fast.next != null) {
                fast = fast.next;
                slow = slow.next;
            }
            return slow;
        }
    }
    
  • 阿尚 普通 2023年8月17日 上午10:50
    class Solution {
        public ListNode getKthFromEnd(ListNode head, int k) {
            if(head == null) return null;
    
            ListNode fast = head;
            ListNode slow = head;
            //快指针先向后移动k次
            while(k-- > 0){
                fast = fast.next;
            }
    
            //快慢指针一起向后移动
            while(fast != null){
                slow = slow.next;
                fast = fast.next;
            }
    
            return slow;
        }
    }
    
  • 3_🔥 永久会员 2023年7月9日 下午10:10
    class Solution {
        public ListNode getKthFromEnd(ListNode head, int k) {
            ListNode slow = head,fast = head;
            for (int i = 0; i < k; i++) {
                fast = fast.next;
            }
            while (fast != null){
                fast = fast.next;
                slow = slow.next;
            }
            return slow;
        }
    }
    

    基础快慢指针题

  • 帅气的冬瓜 普通 2023年6月27日 上午10:40

    打卡

如果您已经成功付款但是网站没有弹出成功提示,请联系站长提供付款信息为您处理