代码注释比较详细:
#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为例,图示如下
数据结构:链表的基本操作(创建,删除,插入,逆序,摧毁),布布扣,bubuko.com
原文:http://blog.csdn.net/u010470972/article/details/37363463