反转链表

来源:互联网 发布:波士顿矩阵图怎么画 编辑:程序博客网 时间:2024/06/04 18:09
其实一直没写过链表。真是灯下黑,要写的时候突然发现对指针的概念又有点懵逼了。。剑指OFFER里面 对链表的函数调用有两种形式(LinkNode** phead)(LinkNode* phead) 第一个表示传入的时候头指针本身,操作时一般解引用*phead,并命名一个头节点的指针来操作要方便点。不然用phead指针在语义上正确,但是操作起来会很麻烦。比如对LinkNode **phead 的赋值就&(LinkNode*) 而且当指针next变化时,本身就跟着变化了,并且有时候需要*phead == null 也需要操作的情况。。用&(null) 不就悲剧了吗于是还是用(LinkNode* phead)来操作。但是有一点。这里传入的对象是LinkNode* phead 头指针的值拷贝,还要返回值来更改phead。。。。

不写不知道一写吓一跳!!!!

struct LinkNode {    int value;    LinkNode *next;    LinkNode(int v) :value(v) {};};struct LinkList {    LinkNode *head;    void push_back(int value);    LinkNode* pop();    LinkList() {        head = NULL;    }};inline void LinkList::push_back(int value) {    LinkNode * node = new LinkNode(value);    if (head == NULL) {        node->next = NULL;        head = node;    }    else {        node->next = head;        head = node;    }}inline LinkNode* LinkList::pop() {    LinkNode* temp = head;    head = head->next;    return temp;}inline void printLinkList(LinkNode* phead) {    using namespace std;    if (phead == NULL) {        return;    }    while (phead) {        cout << "'" << phead->value << "'" << ends;        phead = phead->next;    }    cout << endl;}inline LinkNode* reseverLinkList(LinkNode* phead) {    if (!phead) {        return NULL;    }    LinkNode* temp = NULL;    LinkNode* pnode = phead->next;    phead->next = NULL;    while (pnode) {        temp = pnode->next;        pnode->next = phead;        phead = pnode;        pnode = temp;    }    return phead;}
    LinkList link;    for (int i = 0; i < 10; i++) {        link.push_back(i);    }    printLinkList(link.head);    printLinkList(link.head);    link.head = reseverLinkList(link.head); //由于是值拷贝所以需要重新给head赋值,来更新!!!!    printLinkList(link.head);
原创粉丝点击