1.给定一个头结点为 head
的非空单链表,返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。(876. 链表的中间结点 - 力扣(LeetCode) (leetcode-cn.com))
这里我们只需要在slow向后找一个的时候,fast向后找两个节点,直到fast或fast->next指向NULL。这时slow所指向的节点就是所需的节点。
struct ListNode* middleNode(struct ListNode* head){
struct ListNode*fast=head;
struct ListNode*slow=head;
while(fast&&fast->next)
{
slow=slow->next;
fast=fast->next->next;
}
return slow;
}
2.输入一个链表,输出该链表中倒数第k个结点。
这里我们让fast指针先向后找k个结点,然后再移动slow指针
这样的话,在fast指针指向null的时候slow指向的就是倒数第k个结点
struct ListNode* FindKthToTail(struct ListNode* pListHead, int k ) {
if(k==0)
return NULL;
struct ListNode* fast=pListHead;
struct ListNode* slow=pListHead;
while(k&&fast)
{
fast=fast->next;
k--;
}
if(k>0)
return NULL;
while(fast)
{
fast=fast->next;
slow=slow->next;
}
return slow;
}