思路:
用两种方法:
1.设一个pre在p跑了k个单位后再一起移动到结尾
2.直接把整个list给反转过来,三指针,练手,这里会输出node[k]之后所有所以不能用(这种跟递归差不多,但直接递归无法处理返回ind和返回node,封装个专门回传的对象应该可以,还有就是存入栈那空间换时间)
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};
//2:12--2:39
class Solution {
public:
ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) {
ListNode *p = pListHead;
while(k--){
if(pListHead == NULL)//居然会出越界的k。。。
return NULL;
pListHead = pListHead->next;
}
while(pListHead != NULL){
pListHead = pListHead->next;
p = p->next;
}
return p;
}
};//2:44--3:00
//这个版本在输出的时候发现node[k]下面的所有节点也别输出了,所以他是遍历node[k]下面的节点的,逆序不能用
class Solution {
public:
ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) {
ListNode* head=NULL, *mid=pListHead, *tail=NULL;
if(pListHead == NULL)
return NULL;
else
tail=pListHead->next;
while(mid != NULL){
mid->next=head;
head = mid;
mid = tail;
tail = tail->next;
}
while(head!=NULL&&--k){
head=head->next;
}
return head;
}
};
京公网安备 11010502036488号