剑指offer:链表中倒数第k个结点

题目:

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

思路:

方法1:从前往后扫描链表,先遍历一次统计出节点总数N,然后遍历一次找到第N-k个节点输出。缺点:需要遍历两次。

方法2:设置两个指针,一个指针p1从头指针开始先走k步,然后让第二个指针p2指向头指针,然后两个指针一起往后走,当p1指向最后一个节点时,p2指向的就是倒数第k个节点。

要注意的是特殊情况的处理:空链表,k>N,k<=0。

在线测试:

https://www.nowcoder.com/practice/529d3ae5a407492994ad2a246518148a?tpId=13&tqId=11167&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking

AC代码:

/*
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 == NULL || k <= 0)
		return NULL;
	ListNode* p1 = pListHead;
	int i=1;
	while(p1->next && i<k)
	{
		p1 = p1->next;
		i++;
	}
	if(i<k)
	{
		return NULL;
	}
	ListNode* p2 = pListHead;
	while(p1->next)
	{
		p1 = p1->next;
		p2 = p2->next;
	}
	return p2;
    }
};

猜你喜欢

转载自blog.csdn.net/u012991043/article/details/81118996