一、如何获得链表的中间节点
普通方法:
1、先通过遍历得到链表的长度
2、然后再通过长度遍历得到链表的中间节点
3、当然有一些链表通过一个特殊的头节点记录链表的长度的情况,可能要简单一些。
总公需要遍历的节点个数 1.5n
快慢指针法:
1、使用两个指针进行遍历,然后快指针每次步进2,慢指针每次步进1
2、当快指针到达链表尾部的时候吗,慢指针指向的就是链表的节点
代码实现
int getmid(list *head){
if(head==NULL)
return -1;
list ptrOneStep = head;
list ptrTwoStep = head->next;
while(ptrTwoStep!=NULL && ptrTwoStep->next!=NULL){
ptrOneStep = ptrOneStep->next;
ptrTwoStep = ptrTwoStep->next->next;
}
return ptrOneStep->val;
}
二、链表判环
方法:
1、设置快指针、慢指针,快指针每次都前进两步,慢指针每次都前进一步
2、每次判断快慢指针是否相同如果相同的话,则有环,如果当快指针都遍历结束还没有出现相同的话就没有环
示意图
代码
int getmid(list *head){
if(head==NULL)
return -1;
list ptrOneStep = head;
list ptrTwoStep = head->next;
bool flag = false;
while(ptrTwoStep!=NULL && ptrTwoStep->next!=NULL){
if(ptrTwoStep==ptrTwoStep){
flag = true;
break;
}
ptrOneStep = ptrOneStep->next;
ptrTwoStep = ptrTwoStep->next->next;
}
return ptrOneStep->val;
}