Q22链表的倒数第k个节点

链表的倒数第k个节点

题目

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

思路

遍历一遍得到链表长度,再遍历一遍得到倒数第几个,复杂度为 O ( n 2 ) O(n^2)

只遍历一遍的方法为 ,维持两个指针,两个指针 差为 K-1

然后同时往前走,第一个走到尾,第二个正好就是倒数第k个。

实现

/*
struct ListNode {
	int val;
	struct ListNode *next;
	ListNode(int x) :
			val(x), next(NULL) {
	}
};*/
class Solution {
public:
    ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) {
        //双指针,一前一后,中间隔k-2个节点
        if(pListHead == NULL)
            return NULL;
        ListNode* pa = pListHead;
        ListNode* pb = pa;
        for(int i=0; i<k-1; i++)//注意倒数第0个!
        {
            if(pb->next==NULL)
                return NULL;
            pb = pb->next;
        }
        while(pb->next!=NULL)
        {
            pa = pa->next;
            pb = pb->next;
        }
        return pa;
    }
};
/*
struct ListNode {
	int val;
	struct ListNode *next;
	ListNode(int x) :
			val(x), next(NULL) {
	}
};*/
class Solution {
public:
    ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) {
        if(pListHead==nullptr || k<=0)
            return nullptr;
        ListNode* p1 = pListHead;
        ListNode* p2 = pListHead;
        while(--k)
        {
            if(p1->next!=nullptr)
                p1 = p1->next;
            else
                return nullptr;
        }
        while(true)
        {
            if(p1->next==nullptr)
                break;
            p1 = p1->next;
            p2 = p2->next;
        }
        return p2;
    }
};
发布了48 篇原创文章 · 获赞 10 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/mhywoniu/article/details/105393859
今日推荐