代码注释比较详细:
#include <iostream>
#include <cstdlib>
using namespace std;
struct Node{
int data;
Node* next;
};
Node* head = NULL;
bool create() {
head = (Node*)malloc(sizeof(Node));
if(NULL == head) return false;
head->data = 0;
head->next = NULL;
return true;
}
bool addnode(Node* node) {
if(NULL == head) return false;
Node *p = head->next;
Node *q = head;
while(NULL != p) {
q = p;
p = p->next;
}
q->next = node;
node->next = NULL;
return true;
}
void reverseNodeList() {
if(NULL == head || head->next == NULL) return; //该链表为空或者只有一个节点,那么直接返回
Node *p = head->next;
Node *q = p->next;
Node *t = NULL;
while(NULL != q) {
t = q->next;
q->next = p;
p = q;
q = t;
}
head->next->next = NULL;
head->next = p;
}
bool deletenode(int index) {
if(NULL == head) return false;
Node *p = head->next;
int length = 0; //最后存储的是这个链表的长度
while(NULL != p) {
++length;
p = p->next;
}
if(length < index) return false; //如果要删除的第i个节点不存在,既该函数的参数有问题,则直接返回false
p = head;
Node *q = head;
for(int i = 0; i < index; ++i) {
q = p;
p = p->next;
}
q->next = p->next;
p->next = NULL;
free(p);
return true;
}
void destroyNodeList() {
if(NULL == head) return ; //如果该链表是空链表,则直接返回,无需摧毁
if(NULL == head->next) { //如果该链表只有一个节点
free(head);
head = NULL;
return ;
}
Node *p = head->next;
while(NULL != p) {
Node *q = p;
p = p->next;
free(q);
}
free(head);
head = NULL;
return ;
}
int main() {
create(); //创建一个带有表头的空的单链表
Node *node1 = (Node*)malloc(sizeof(Node)); //设立一个节点,下面两行对其进行赋值
node1->data = 1;
node1->next = NULL;
addnode(node1); //将上面这个节点插入到链表尾部
Node *node2 = (Node*)malloc(sizeof(Node)); //设立一个节点,下面两行对其进行赋值
node2->data = 2;
node2->next = NULL;
addnode(node2); //将上面这个节点插入到链表尾部
reverseNodeList(); //将上面这个带有一个表头节点以及两个节点的链表进行逆序
Node *node3 = (Node*)malloc(sizeof(Node)); //设立一个节点,下面两行对其进行赋值
node3->data = 3;
node3->next = NULL;
addnode(node3); //将上面这个节点插入到链表尾部
deletenode(2); //删除这个链表中第二个节点
destroyNodeList(); //摧毁这个链表
return 0;
}
以上比较难理解的是链表的逆序,看下面的详解:
要求将一带链表头List head的单向链表逆序。
分析:
1). 若链表为空或只有一个元素,则直接返回;
2). 设置两个前后相邻的指针p,q. 将p所指向的节点作为q指向节点的后继;
3). 重复2),直到q为空
4). 调整链表头和链表尾
示例:以逆序A->B->C->D为例,图示如下