输入一个链表,输出该链表中倒数第k个结点
struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { } };
输入一个链表,输出该链表中倒数第k个结点
第一种方法:定义两个结点指针p1,p2指向该链表的头结点,然后利用p1遍历整个链表,记下长度n;然后再利用p2往后遍历n-k个结点即可,因为p2已经指向了头结点。
ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) { ListNode *ptr = pListHead;//遍历指针 ListNode *ptr1 = pListHead;//返回指针 if (pListHead == NULL || k == 0) return NULL; int n = 1;//已经指向第一个结点 while (ptr->next != NULL){ ptr=ptr->next; n++; } if(n<k) return NULL; for (int i = 0; i < n - k; ++i) ptr1 = ptr1->next; return ptr1; }
第二种方法:定义两个结点指针p1,p2指向该链表的头部,然后p1先遍历k-1个结点,然后p1和p2同时遍历。返回p2.
ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) { ListNode *p1 = pListHead; ListNode *p2 = pListHead; if (pListHead == NULL || k == 0) return NULL; for (int i = 0; i < k - 1; ++i){ if (p1->next != NULL) p1 = p1->next; else return NULL; //还没到第k个就到尾了,及K>链表长度。 } while (p1->next != NULL){ p1=p1->next; p2 = p2->next; } return p2;
两个程序在网上都编译通过
总结:当链表比较小时,第一种方法是很有效的,但是链表比较大时,就有点浪费了,而第二种方法都合适,故可以多多考虑第二种方法