题意:
有一个长度为 n 的链表,输出该链表的后 k 个节点。
如果该链表长度小于k,请返回一个长度为 0 的链表。
方法一:
思维
思路:求一个链表的后k个节点。可以先求链表的总长度,用总长度减去k,就可以得到从前往后顺步走的长度。
class Solution { public: ListNode* FindKthToTail(ListNode* pHead, int k) { ListNode *p=pHead; int n=0;//链表的大小 while(p!=nullptr){ n++; p=p->next; } if(n<k)//如果链表小于k,则返回空 return nullptr; n-=k;//总数-倒数的数=顺步走的次数 p=pHead; while(n--){//遍历 p=p->next; } return p; } };
时间复杂度:空间复杂度:
方法二:
双指针
思路:
p指针和q指针都指向头结点,再让q指针移动k步,这样就能让p指针和q指针的间隔是k。
而后p指针和q指针一起移动,直到q指针到达边界(即null),则输出p指针。
class Solution { public: ListNode* FindKthToTail(ListNode* pHead, int k) { ListNode *p=pHead,*q=pHead;//初始化 while(k&&q!=nullptr){//先让q指针移动k步,这样就能让p指针和q指针的间隔是k k--; q=q->next; } if(k==0){ while(q!=nullptr){//p指针和q指针一起移动,直到q==null p=p->next; q=q->next; } return p;//返回p }else{//如果链表小于k,则返回空 return nullptr; } } };
时间复杂度:
空间复杂度: