目录
题目一:
给定一个带有头结点 head 的非空单链表,返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。
力扣https://leetcode-cn.com/problems/middle-of-the-linked-list/description/
思路:
创建两个指针 一个快指针 一个慢指针
快指针一次两步 慢指针一次一步
这样遍历一次就可以实现
源代码:
struct ListNode* middleNode(struct ListNode* head) { //慢指针一次走一步 快指针一次走两步
struct ListNode* slow, * fast;
slow = fast = head;
while (fast && fast->next)
{
slow = slow->next;
fast = fast->next->next;
}
return slow;
}
题目二:
输入一个链表,输出该链表中倒数第k个结点。
思路:
同样创建两个指针
一个快指针 一个慢指针
快指针先走K步 (走的过程中要注意快指针可能就为空了)
之后快慢指针一起前进
直到快指针为空为止
源代码:
struct ListNode* FindKthToTail(struct ListNode* pListHead, int k) {
// write code here
struct ListNode* fast, * slow;
fast = slow = pListHead;
while (k--)
{
if (fast == NULL)//这里有可能解引用野指针
{
return NULL;
}
fast = fast->next;
}
while (fast)
{
fast = fast->next;
slow = slow->next;
}
return slow;
}