题目:给定一个带有头结点的非空单链表 L,返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。
解题思路:快慢指针
/*
快慢指针,与链表判环思想相似
*/
ListNode* middleNode(LinkList& L){
ListNode* left = L;
ListNode* right = L;
while(right != NULL && right->next != NULL){
left = left->next;
right = right->next->next;
}
return left;
}
全部代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
typedef struct node{
int val;
struct node* next;
}ListNode,*LinkList;
//与链表判环思想相似
ListNode* middleNode(LinkList& L){
ListNode* left = L;
ListNode* right = L;
while(right != NULL && right->next != NULL){
left = left->next;
right = right->next->next;
}
return left;
}
//尾插法
ListNode* createListR(int finish){ //约定以finish结束
int x;
cin >> x;
if(x == finish) return NULL; //递归边界
ListNode* p = new ListNode;
p->val = x;
p->next = createListR(finish); //把剩余的创建任务交给下一层
return p;
}
void printList(ListNode* p){
if(p == NULL) return;
cout<<p->val<<" ";
printList(p->next);
}
int main(){
ListNode* p = new ListNode;
p->next = createListR(9999);
printList(p->next);
cout<<endl;
ListNode* k = middleNode(p);
cout<<k->val;
}
运行结果:
更多代码请参考:手撕考研数据结构(代码汇总)