反转链表

其实一直没写过链表。真是灯下黑,要写的时候突然发现对指针的概念又有点懵逼了。。
剑指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);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值