思路1:
思路2:
代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
typedef struct ListNode ListNode;
struct ListNode* middleNode(struct ListNode* head) {
//快慢指针
ListNode* fast = head;
ListNode* slow = head;
while(fast && fast->next)
{
//慢指针每次走一步
slow = slow->next;
//快指针每次走两步
fast = fast->next->next;
}
//此时slow指向的节点刚好就是中间节点
return slow;
}
提交结果:
这里输出3,4,5是因为这是链表,返回的时候返回的是3这个节点的地址,3节点的next指针指向的是4节点,以此类推直到某个节点的next指针指向空的时候就不打印。
快慢指针的原理:
修改循环条件:
当我们把while循环中的两条表达式交换一下顺序,此时代码会有问题。
原因:
建议不要修改while循环的顺序,这么小的细节找起来太难了。
标签:slow,ListNode,struct,fast,next,链表,单链,节点 From: https://blog.csdn.net/m0_74271757/article/details/140446236