C++遍历一遍求出单链表中间节点的方法

题目:给出一个单链表,不知道节点N的值,怎样只遍历一次就可以求出中间节点,写出算法。

解析:设立两个指针,比如*p和*q。p每次移动两个位置,即p=p->next->next,q每次移动一个位置,即q=q->next。

当p到达最后一个节点时候,q就是中间节点了。

类似的可以用一次遍历方法得到三分之一、四分之一、前几个节点。

代码贴出:

  1. #include <iostream>
  2. using namespace std;
  3. typedef struct Student{
  4. int data;
  5. struct Student *next;
  6. }Node;
  7. /*
  8. * 遍历一遍就得到单链表的中间结点的方法
  9. * 思想:两个指针,一个每次走一步,另一个每次走两步,两步走完的时候,一步的就是结果
  10. */
  11. int getCenterNode(Node *head){
  12. Node *p2 = head;
  13. Node *p1 = head;
  14. while(p2->next!=NULL && p2->next->next!=NULL){
  15. p2 = p2->next->next;
  16. p1 = p1->next;
  17. }
  18. return p1->data;
  19. }
  20. void displayList(Node *head){
  21. cout<<"List:"<<endl;
  22. Node *p = head->next;
  23. while(p!=NULL){
  24. cout<<p->data<<" ";
  25. p=p->next;
  26. }
  27. cout<<endl;
  28. }
  29. void main(){
  30. Node *head,*tmp;
  31. int i=0;
  32. head = (Node*)malloc(sizeof(Student));
  33. head->next = NULL;
  34. for(i=0;i<10;++i){
  35. tmp = (Node*)malloc(sizeof(Student));
  36. tmp->data = i;
  37. tmp->next = head->next;
  38. head->next = tmp;
  39. }
  40. displayList(head);
  41. cout<<getCenterNode(head)<<endl;
  42. system("pause");
  43. }

posted @ 2013-04-11 19:32  ~风~  阅读(979)  评论(0编辑  收藏  举报