链表中倒数第k个结点
链表中倒数第k个结点
题目描述
输入一个链表,输出该链表中倒数第k个结点。
思想(没想出来:(): 一次遍历同时找出倒数第k个, 利用两个指针变量, 其中一个先走k-1步后, 第二个指针变量开始游走, 直至第一个指针走完整个数组, 此时第二个指针变量指向倒数第k个元素
版本一来自牛客网, 版本二参考书上思路编的
版本一: 返回方式太霸道了, return i < k ? NULL : q;把i<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) {
        ListNode *p, *q;
        p = q = pListHead;
        int i = 0;
        for (; p != NULL; i++) {
            if (i >= k)
                q = q->next;
            p = p->next;
        }
        return i < k ? NULL : q;
    }
};
版本二: 牛客提交报错, vs中的测试通过, 可能测试不全
/*
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 ((NULL == pListHead) || (NULL == pListHead->next) || (0 == k)) {
		return NULL;
	}
    
    ListNode *fcurrent = pListHead->next;
	ListNode *scurrent = pListHead->next;
	for (decltype(k) i = 0; i < k - 1; i++) {
		fcurrent = fcurrent->next;
	}
	while (NULL != fcurrent->next) {
		scurrent = scurrent->next;
		fcurrent = fcurrent->next;
	}
	return scurrent;
}
};
版本二的测试程序:
#include <iostream>
using namespace std;
struct ListNode {
	int val;
	struct ListNode *next;
	ListNode(int x) :
		val(x), next(NULL) {
	}
};
ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) {
	ListNode *fcurrent = pListHead->next;
	ListNode *scurrent = pListHead->next;
	if ((NULL == pListHead) || (NULL == pListHead->next) || (0 == k)) {
		return NULL;
	}
	for (decltype(k) i = 0; i < k - 1; i++) {
		fcurrent = fcurrent->next;
	}
	while (NULL != fcurrent->next) {
		scurrent = scurrent->next;
		fcurrent = fcurrent->next;
	}
	return scurrent;
}
int main(void) {
	ListNode head(0), n1(1), n2(2), n3(3), n4(4), n5(5);
	ListNode *temp = NULL;
	head.next = &n1;
	n1.next = &n2;
	n2.next = &n3;
	n3.next = &n4;
	n4.next = &n5;
	temp = FindKthToTail(&head, 5);
	cout << temp->val << endl;
}
if ((NULL == pListHead) || (NULL == pListHead->next) || (0 == k)) {
	return NULL;
}
ListNode *fcurrent = pListHead->next;
ListNode *scurrent = pListHead->next;
for (int i = 0; (NULL != fcurrent->next); i++) {
	if (i >= k - 1) {
		scurrent = scurrent->next;
	}
	fcurrent = fcurrent->next;
}
return scurrent;
                    
                
                
            
        
浙公网安备 33010602011771号