1.链表的中间结点
题目:
给定一个头结点为 head 的非空单链表,返回链表的中间结点。
如果有两个中间结点,则返回第二个中间结点。
当fast->next指向NULL时,结束循环,slow指针指向的结点为中间结点。
当fast指向NULL时,结束循环,slow指针指向的结点为中间结点(结点数为偶数个时,返回中间两个数的第二个数)。
//快慢指针,快指针一次走两步,慢指针一次走一步,遍历一次
struct ListNode* middleNode(struct ListNode* head){
struct ListNode* fast = head,*slow = head;
while(fast && fast->next) //fast与fast->next均不等于null
{
slow = slow->next;
fast = fast->next->next;
}
return slow; //slow是中间结点
}
2.链表中倒数第k个指针
题目:
输入一个链表,输出该链表中倒数第k个结点。
如果该链表长度小于k,请返回空。
fast先走k步,当fast指向null时,slow就是指向的倒数第k个结点。
ListNode* FindKthToTail(ListNode* pHead, int k) {
struct ListNode* fast = pHead, *slow = pHead;
//fast先走k步
while(k--)
{
//说明k比链表长度要大,那么倒数第k个就是空
if(fast == NULL)
{
return NULL;
}
fast = fast->next;
}
while(fast)
{
slow = slow->next;
fast = fast->next;
}
return slow;
}