C++遍历一遍求出单链表中间节点的方法
题目:给出一个单链表,不知道节点N的值,怎样只遍历一次就可以求出中间节点,写出算法。
解析:设立两个指针,比如*p和*q。p每次移动两个位置,即p=p->next->next,q每次移动一个位置,即q=q->next。
当p到达最后一个节点时候,q就是中间节点了。
类似的可以用一次遍历方法得到三分之一、四分之一、前几个节点。
代码贴出:
- #include <iostream>
- using namespace std;
- typedef struct Student{
- int data;
- struct Student *next;
- }Node;
- /*
- * 遍历一遍就得到单链表的中间结点的方法
- * 思想:两个指针,一个每次走一步,另一个每次走两步,两步走完的时候,一步的就是结果
- */
- int getCenterNode(Node *head){
- Node *p2 = head;
- Node *p1 = head;
- while(p2->next!=NULL && p2->next->next!=NULL){
- p2 = p2->next->next;
- p1 = p1->next;
- }
- return p1->data;
- }
- void displayList(Node *head){
- cout<<"List:"<<endl;
- Node *p = head->next;
- while(p!=NULL){
- cout<<p->data<<" ";
- p=p->next;
- }
- cout<<endl;
- }
- void main(){
- Node *head,*tmp;
- int i=0;
- head = (Node*)malloc(sizeof(Student));
- head->next = NULL;
- for(i=0;i<10;++i){
- tmp = (Node*)malloc(sizeof(Student));
- tmp->data = i;
- tmp->next = head->next;
- head->next = tmp;
- }
- displayList(head);
- cout<<getCenterNode(head)<<endl;
- system("pause");
- }