1.快慢指针

  1. ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) {
  2. ListNode* fast = pListHead, *slow = pListHead;
  3. for(int i = 0;i < k;i++){
  4. if(!fast)return NULL;
  5. fast = fast->next;
  6. }
  7. while(fast){
  8. fast = fast->next;
  9. slow = slow->next;
  10. }
  11. return slow;
  12. }

(1)k为0
(2)结点为空
(3)k比结点数大

引申题

1.求链表的中间结点。如果总数为奇数,返回中间结点;如果为偶数,返回中间两个结点任意一个
思路:定义两个指针,一个一次走一步,另一个一次走两步
2.判断一个单向链表是否形成了环形结构
思路:定义两个指针,一个一次走一步,另一个一次走两步,快指针追上慢指针,则为环形结构;快指针走到了链表尾也没有追到慢指针,则不是