题目描述
输入一个链表,输出该链表中倒数第k个结点。
解题思路
本题是典型的双指针法链表题,可以用两个指针:first和second分别指向头结点,其中first先往前走k步,然后first和second同时向前走,直到first指向NULL,此时second指向的节点便是链表中倒数第k个结点。注意特殊情况的处理,给出的链表头指针可能为空,k也可能为0,所以首先判断若不符合条件则返回NULL;其次若k大于链表的长度,可能first走不到第n-k+1个节点,为了处理这种情况,second先指向NULL,直到first走了k步之后在指向头结点,这样最后直接返回second即可。
代码
1 /* 2 struct ListNode { 3 int val; 4 struct ListNode *next; 5 ListNode(int x) : 6 val(x), next(NULL) { 7 } 8 };*/ 9 class Solution { 10 public: 11 ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) { 12 if(pListHead == NULL || k == 0) 13 return NULL; 14 ListNode* first = pListHead; 15 ListNode* second = NULL; 16 while(first != NULL){ 17 if(k > 0){ 18 first = first->next; 19 k--; 20 if(k == 0) 21 second = pListHead; 22 } 23 else{ 24 first = first->next; 25 second = second->next; 26 } 27 } 28 return second; 29 } 30 };