看接下来的一道题目
1、给定一个头结点为 head 的非空单链表,返回链表的中间结点。
如果有两个中间结点,则返回第二个中间结点。
例子:[1,2,3,4,5] 返回中间节点3
[1,2,3,4,5,6] 返回中间节点4
我们该如何做呢,首先这里用到了快慢指针,就是让两个指针同时指向头节点,一个指针一个一个的走,一个指针是两个两个的走,看下面的代码
struct ListNode* middleNode(struct ListNode* head){struct ListNode* slow,*fast;slow=fast=head;//偶数节点时,fast->next为空代表结束//奇数节点时 fast空代表结束while(fast&&fast->next){slow=slow->next;fast=fast->next->next;}return slow;}
下面这个例题时快慢指针的变形,类似于快慢指针
2、输入一个链表,输出该链表中倒数第k个结点。
输入:
1,{1,2,3,4,5}
返回值:{5}
struct ListNode* FindKthToTail(struct ListNode* pListHead, int k ) {struct ListNode* slow,* fast;slow=fast=pListHead;//先让fast走k步,拉开差距while(k--){//如果fast为空,就说明倒数k步已经超过链表范围,直接返回NULLif(fast==NULL)return NULL;fast=fast->next;}while(fast){slow=slow->next;fast=fast->next;}return slow;}