忘记什么时候做的笔试题了。记忆力差没办法。
一看到这倒题目,下意识的想到的解决方案便是首先循环遍历链表获得链表长度Len,然后再次循环遍历链表查找Len/2处的中间节点。在这种情况下,其时间复杂度由两次循环决定:O(L+L/2)=O(3L/2)。
尽管这种思路也能解决问题,但也许存在更好的方法。上次我们谈到利用双指针来寻找链表中倒数第N个元素结点,现在我们同样也可以利用双指针来查找中间节点:
设置两个指针*search,*mid,初始时,都指向头结点。其中*search的移动速度为*mid的两倍。类比物理中的匀速运动,相同时间内,*search经过的结点应该是*mid结点个数的2倍,也就说,当*search结点到达链表终点时,*mid在链表中间结点处。
下面放上代码实现:
#include<stdlib.h>
#include<string.h>
#include<stdio.h>
typedef int elemType;
typedef struct Node{//定义链接节点
elemType element;
Node* next;
}Node;
int insertLast(Node** pNode, elemType ele);
//1、初始化链表,未带头结点
void init(Node** pNode){
*pNode = NULL;
printf("------>链表初始化<------\n");
}
void init_n(Node** pNode){
*pNode = (Node*)malloc(sizeof(Node));//产生头结点,并使pNode头指针指向头结点
if (!(*pNode)){
printf("头结点初始化空间失败\n");
}
printf("------>链表初始化<------\n");
(*pNode)->next = NULL;
}
//1、创建链表
Node* create(Node* pHead){
Node* p1;//代表新节点
Node * p2;//代表尾节点
p1 = p2 = (Node*)malloc(sizeof(Node));//申请节点
if (p1 == NULL || p2 == NULL){
printf("内存空间申请失败\n&