剑指offer相关题目:求链表的中间结点

本文介绍了一种通过定义两个指针,一个每次移动两步,另一个每次移动一步来寻找链表中间节点的方法。当快指针到达链表末尾时,慢指针正好位于链表的中间位置。提供了不同情况下的测试用例,包括奇数、偶数长度的链表,只有一个节点,两个节点以及空链表的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

// 求链表的中间结点

//思路:定义两个指针,第一个指针每次走两步,第二个指针每次走一步
//当走的快的指针走到链表的末尾时,走得慢的指针正好在链表的中间

ListNode* FindMiddleNode(ListNode* pListHead)

{
if(pListHead==NULL)
return NULL;
ListNode* pFirst=pListHead;
ListNode* pSecond=pListHead;
while (pSecond->m_pNext!=NULL)
{
pSecond=pSecond->m_pNext;
if(pSecond->m_pNext==NULL)
break;
pSecond=pSecond->m_pNext;
pFirst=pFirst->m_pNext;
}
return pFirst;

}

//************测试相关题目****************
// 奇数链表
void TestForRelative1()
{
printf("=====Test1 starts:=====\n");
ListNode* pNode1 = CreateListNode(1);
ListNode* pNode2 = CreateListNode(2);
ListNode* pNode3 = CreateListNode(3);
ListNode* pNode4 = CreateListNode(4);
ListNode* pNode5 = CreateListNode(5);


ConnectListNodes(pNode1, pNode2);
ConnectListNodes(pNode2, pNode3);
ConnectListNodes(pNode3, pNode4);
ConnectListNodes(pNode4, pNode5);
//求中间结点
printf("expected result: 3.\n");
ListNode* pNode = FindMiddleNode(pNode1);
PrintListNode(pNode);
DestroyList(pNode1);
}
// 偶数结点
void TestForRelative2()
{
printf("=====Test1 starts:=====\n");
ListNode* pNode1 = CreateListNode(1);
ListNode* pNode2 = CreateListNode(2);
ListNode* pNode3 = CreateListNode(3);
ListNode* pNode4 = CreateListNode(4);


ConnectListNodes(pNode1, pNode2);
ConnectListNodes(pNode2, pNode3);
ConnectListNodes(pNode3, pNode4);
//求中间结点
printf("expected result: 2.\n");
ListNode* pNode = FindMiddleNode(pNode1);
PrintListNode(pNode);
DestroyList(pNode1);
}
// 只有一个结点
void TestForRelative3()
{
printf("=====Test1 starts:=====\n");
ListNode* pNode1 = CreateListNode(1);

//求中间结点
printf("expected result: 1.\n");
ListNode* pNode = FindMiddleNode(pNode1);
PrintListNode(pNode);
DestroyList(pNode1);
}
// 只有两个结点
void TestForRelative4()
{
printf("=====Test1 starts:=====\n");
ListNode* pNode1 = CreateListNode(1);
ListNode* pNode2 = CreateListNode(2);


ConnectListNodes(pNode1, pNode2);
//求中间结点
printf("expected result: 1.\n");
ListNode* pNode = FindMiddleNode(pNode1);
PrintListNode(pNode);
DestroyList(pNode1);
}
// 空指针
void TestForRelative5()
{
printf("=====Test1 starts:=====\n");
ListNode* pNode1 = NULL;
//求中间结点
printf("expected result: NULL.\n");
ListNode* pNode = FindMiddleNode(pNode1);
PrintListNode(pNode);
DestroyList(pNode1);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值