剑指Offer -14 - 链表中倒数第k个结点 - C++/Java

题目描述

输入一个链表,输出该链表中倒数第k个结点。

解题思路

最容易想到的暴力解法,遍历两遍链表,一遍求长度,二遍找点,复杂度太高。

本题采用 快慢指针法
快指针先遍历k个结点,然后快慢指针同时遍历,快指针到达链表尾,则慢指针正处在倒数第K个结点的位置。

具体代码

  • C++
/*
struct ListNode {
	int val;
	struct ListNode *next;
	ListNode(int x) :
			val(x), next(NULL) {
	}
};*/
class Solution {
public:
    ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) {
        ListNode *quick = pListHead;
        ListNode *slow = pListHead;
        if(pListHead == NULL || k < 0)
            return NULL;
        while(k > 0){
            if(quick!=NULL){
                quick = quick->next;
                k --;
            }
            else
                return NULL;
           
        }
        while(quick != NULL){
            quick = quick->next;
            slow = slow->next;
        }
        return slow;
    }
};
  • Java
/*
public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}*/
public class Solution {
    public ListNode FindKthToTail(ListNode head,int k) {
        ListNode quick = head;
        ListNode slow = head;
        while(k > 0){
            if(quick != null){
                quick = quick.next;
                k --;
            }
            else
                return null;
        }
        while(quick != null){
            quick = quick.next;
            slow = slow.next;
        }
        return slow;
    }
}
发布了50 篇原创文章 · 获赞 15 · 访问量 4746

猜你喜欢

转载自blog.csdn.net/qq_41133986/article/details/105015973
今日推荐