#include <stdio.h>
#include <stdlib.h>
#include <time.h>
//链表结构
typedef struct _tagLinkList {
int num; //数值
struct _tagLinkList *next; //链表下一个结点
}LinkList,*PLINK;
//初始化链表
bool init_list(PLINK* head)
{
PLINK pLink = NULL;
if (NULL == head)
{
return false;
}
pLink = (PLINK)malloc(sizeof(LinkList));
if (NULL == pLink)
{
return false;
}
pLink->num = 0;
pLink->next = NULL;
*head = pLink;
return true;
}
//尾部插入
bool insert_node(PLINK head,const LinkList node)
{
PLINK insert_node = NULL;
if (NULL == head)
{
return false;
}
insert_node = (PLINK)malloc(sizeof(LinkList));
if (NULL == insert_node)
{
return false;
}
insert_node->num = node.num;
insert_node->next = NULL;
while (NULL != head->next)
{
head = head->next;
}
head->next = insert_node;
return true;
}
bool delete_node(PLINK* head,const LinkList node)
{
PLINK prev = NULL,curr = NULL;
if (NULL == head)
{
return false;
}
while ((NULL != curr) && (curr->num != node.num))
{
prev = curr;
curr = curr->next;
}
if (NULL == curr)
{
return false;
}
//判断需要删除的结点位置
if (curr == *head)
{//如果删除的是头结点
*head = (*head)->next;
}
else if (NULL == curr->next)
{//如果删除的是尾结点
prev->next = NULL;
}
else
{//如果删除的是中间结点
prev->next = curr->next;
}
//释放结点
free(curr);
curr = NULL;
return true;
}
//打印链表
void print_list(PLINK head)
{
if (NULL != head)
{
head = head->next;
}
while (NULL != head)
{
printf("%d ",head->num);
head = head->next;
}
puts("\n");
}
//销毁链表
void destroy_list(PLINK head)
{
PLINK prev = NULL;
while (NULL != head)
{
prev = head;
head = head->next;
free(prev);
prev = NULL;
}
}
//查找中间结点,采用快慢指针法
PLINK find_middle_node(PLINK head)
{
PLINK curr = head;
while ((NULL != head) && (NULL != head->next))
{
curr = curr->next;
head = head->next->next;
}
return curr;
}
int main(void)
{
PLINK head = NULL;
int i = 0;
LinkList tmpNode = {0};
if (!init_list(&head))
{
return 1;
}
srand((unsigned)time(NULL));
for (i = 0; i < 10; ++i)
{
int num = rand()%100;
tmpNode.num = num;
tmpNode.next = NULL;
if (!insert_node(head,tmpNode))
{
return 1;
}
}
print_list(head);
PLINK middle_node = find_middle_node(head);
printf("The middle node is:%d\n",middle_node->num);
destroy_list(head);
return 0;
}
在寻找中间结点的函数中,采用了一种叫做快慢指针的方法,这样只需要n/2次运算即可找到中间结点,比常规思路(n + n/2)快了很多。