-
题目:输入一个链表,输出该链表中倒数第k个结点。
-
解题笔记:
踩坑:注意三种特殊的边界检测情况,都需要返回NULL(1)k的值要大于链表长度len (2)k < 1 (3)头节点直接是NULL
-
Code
解法1:
扫一趟链表记录长度len,倒数第k个数就是正数len-k+1
个,所以只需要从给定的头节点再一次遍历len-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) {
if(pListHead == NULL || k < 1) return NULL;
ListNode* cur1 = pListHead;
int len = 0;
while(cur1){
len++;
cur1 = cur1->next;
}
if(k > len) return NULL;
if(k == len) return pListHead;
cur1 = pListHead;
for(int i = 0; i < len-k; ++i){
cur1 = cur1->next;
}
return cur1;
}
};
解法2:
要求只扫一遍完成任务,所以定义两个临时指针cur1和cur2,先让cur1向前走k-1步(因为从链表尾部走k-1步就可以到达倒数第k个节点)
之后cur2和cur1同时前进,当cur1到达末尾的时候cur2指向的就是目标节点
```
/*
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 < 1) return NULL;
ListNode* cur1 = pListHead;
ListNode* cur2 = pListHead;
for(int i = 0; i < k-1; ++i){
if(cur1->next != NULL){
cur1 = cur1->next;
}
else{
return NULL;
}
}
while(cur1->next != NULL){
cur1 = cur1->next;
cur2 = cur2->next;
}
return cur2;
}
};
```