其实一直没写过链表。真是灯下黑,要写的时候突然发现对指针的概念又有点懵逼了。。
剑指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);