思路:
用两种方法:
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; } };