题目
实现一个函数,返回单链表的中间节点,如果链表中节点个数为奇数,则返回中间节点,否则,返回中间两个节点中的任意一个。
思路
设置快指针和慢指针,快指针走两步,慢指针走一步,当快指针走到末尾时,慢指针的位置即为中间节点。
代码
#include<iostream>
using namespace std;
typedef struct ListNode {
int value;
ListNode* next;
ListNode(int v):value(v), next(NULL) {
}
} *List;
ListNode* getMiddleNode(List head) {
if(NULL == head)
return NULL;
List p_fast = head, p_slow = head;
//定义p_fast = head->next时 当节点数为偶数时中间节点是靠前的那个
while(p_fast->next) {
p_fast = p_fast->next;
p_slow = p_slow->next;
if(p_fast->next)
p_fast = p_fast->next;
}
return p_slow;
}
int main() {
int n = 9;
List h = new ListNode(1);
List p = h;
for(int i=2; i<=n; i++) {
p->next = new ListNode(i);
p = p->next;
}
p = getMiddleNode(h);
if(p)
cout << p->value << endl;
else
cout << "NULL" << endl;
return 0;
}