描述:
输入一个链表,输出该链表中倒数第k个结点。
思路1:
我么都知道链表是不计数的,没有处理的情况下是不知道链表的结点个数的。因此最开始拿到这道题的想法就是想去计算得到链表的结点个数,知道结点个数后要求就很好达到了,这种想法下可以有以下代码:
class Solution {
public:
ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) {
if(pListHead == NULL || k == 0)
return NULL;
ListNode* p = pListHead;
int level = 0;
while(p != NULL) {
level++;
p = p->next;
}
if(k > level) return NULL;
ListNode* q = pListHead;
for(int i = 1; i < level + 1 - k; i++) {
q = q->next;
}
return q;
}
};
思路2:
个人感觉思路去1不是很好,感觉都是靠蛮力,没有什么技巧,在看了其他的解题方法后,觉得以下方法不很好,很巧妙。
链接来源:牛客网
https://www.nowcoder.com/questionTerminal/529d3ae5a407492994ad2a246518148a
代码思路如下:两个指针,先让第一个指针和第二个指针都指向头结点,然后再让第一个指正走(k-1)步,到达第k个节点。然后两个指针同时往后移动,当第一个结点到达末尾的时候,第二个结点所在位置就是倒数第k个节点了。
class Solution {
public:
ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) {
if(pListHead == NULL || k == 0)
return NULL;
ListNode* p1 = pListHead;
ListNode* p2 = pListHead;
for(int i = 1; i < k; i++) {
if(p1->next != NULL) {
p1 = p1->next;
} else {
return NULL;
}
}
while(p1->next != NULL) {
p1= p1->next;
p2 = p2->next;
}
return p2;
}
};