码迷,mamicode.com
首页 > 其他好文 > 详细

找链表的中间结点

时间:2015-05-29 07:26:28      阅读:223      评论:0      收藏:0      [点我收藏+]

标签:

//找链表的中间结点
/*
已知单链表L,编写算法找出该链表的中间位置的结点。

思考:
1、一种想法就是从头遍历到尾部,记录长度。随后再次遍历一次,直到长度的二分之一即找到。时间复杂度为O(3n/2)
2、另一种想法:设置快慢指针,快指针一次走两步,慢指针一次走一步,当快指针走到NULL的时候,慢指针的位置就是链表的中间位置

本程序使用第二种想法
*/


#include <iostream>
#include <string>

using namespace std;

int L_length = 0;



template<class T>
struct Node {
    T value;
    Node *next;
    Node() {
        next = NULL;
    }
    Node(const T &data) {
        value = data;
        next = NULL;
    }
};

template<class T>
void PushinList(Node<T>* &L, const T &t) {
    Node<T> *n = new Node<T>(t);
    n->next = L->next;
    L->next = n;
    L_length++;
}

template<class T>
void PrintList(const Node<T>* L) {
    cout << "打印链表:";
    for (Node<T>* p = L->next; p != NULL; p = p->next) cout << p->value << " ";
    cout << endl;
}

template<class T>
Node<string>* GetMiddle(const Node<T>* L) {
    Node<string> *p_fast, *p;
    p = p_fast = L->next;
    while (p_fast) {
        p_fast = p_fast->next;
        if (p_fast) p_fast = p_fast->next;
        else break;
        p = p->next;
    }
    return p;
}



int main(void) {
    Node<string>* L = new Node<string>();
    string str;
    cout << "创建链表(以-1结尾):";
    while (cin >> str && str != "-1")
        PushinList(L, str);
    PrintList(L);
    Node<string>* p = GetMiddle(L);

    cout << "中部节点为" << p->value << endl;

    system("pause");
    return 0;
}

/*
样例输入:
a b c d e f g -1
a b c d e f -1
样例输出:
d
c
*/

 

找链表的中间结点

标签:

原文地址:http://www.cnblogs.com/magina888/p/4537478.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!