给定一个具有头部节点的非空单链表,返回链表的中间节点。
如果有两个中间节点,则返回第二个中间节点。
例1:
输入:[1,2,3,4,5]
输出:此列表中的节点3(序列化:[3,4,5])
返回的节点值为3。(judge对这个节点的序列化是[3,4,5])。
注意,我们返回了一个ListNode对象ans,这样:
ans.val = 3, ans.next.val = 4, ans.next.next.val = 5, and ans.next.next.next = NULL.
例2:
输入:[1,2,3,4,5,6]
输出:此列表中的节点4(序列化:[4,5,6])
由于列表有两个中间节点,值为3和4,因此返回第二个节点。
#include <stdlib.h>
#include <malloc.h>
#include <stdio.h>
#define ERROR 0
#define OK 1
struct ListNode* middleNode(struct ListNode* head);//函数声明
//以下是单链表的建立
typedef struct ListNode
{
int val;
struct ListNode *next;
}LN;
void CopyValue(LN* s1, LN* s2)
{
s1->val = s2->val;
}
LN* CreateNode(LN *num)
{
LN *node = (LN*)malloc(sizeof(LN));
if (!node)
{
printf("---------------------\n申请失败\n");
return NULL;
}
CopyValue(node, num);
node->next = NULL;
return node;
}
int InputValue(LN* num)
{
if (!num)
return ERROR;
scanf("%d", &num->val);
}
LN* CreateLink()
{
LN* num = { 0 };
LN* head = CreateNode(&num);
if (!head)
exit(-1);
int n, i;
LN* NewNode, *tail = head;
printf("---------------------\n请输入个数\n");
scanf("%d", &n);
printf("---------------------\n请输入%d个数\n", n);
for (i = 0; i < n; i++)
{
InputValue(&num);
NewNode = CreateNode(&num);
if (!NewNode)
break;
tail->next = NewNode;
tail = NewNode;
}
return head;
}
int FreeLink(LN* head)
{
//判断链表是否为空,如果为空,则返回
if (!head)
return ERROR;
//如果非空,则逐个结点释放
LN* p, * q;
p = head;
while (p->next != NULL)
{
q = p->next;
p->next = q->next;
free(q);
}
//释放头结点
free(p);
}
void DisplayLink(LN* s)
{
printf("---------------------\n遍历一次单链表\n---------------------\n");
LN* p = s;
while (p != NULL)
{
printf("%d ", p->val);
p = p->next;
}
}
int main()
{
LN* head = CreateLink();
LN *p =middleNode(head);//拿个指针接受
DisplayLink(p);
//DisplayLink(head);
FreeLink(p);
//FreeLink(head);
return 0;
}
struct ListNode* middleNode(LN *head)
{
LN* low = head;
LN* fast = head;
while (fast != NULL && fast->next != NULL)
{
fast = fast->next->next;
low = low->next;
}
return low;
}