struct node { int data; struct node* next; }; 创建单链表的程序为: struct node* create(unsigned int n) { //创建长度为 n 的单链表 assert(n > 0); node* head; head = new node; head->next = NULL; cout << "请输入 head 节点的值(int 型):"; cin >> head->data; if (n == 1) { return head; } node* p = head; for (unsigned int i = 1; i < n; i++) { node* tmp = new node; tmp->next = 0; cout << "请输入第" << i+1 << "个节点的值(int):"; cin >> tmp->data; p->next = tmp; p = tmp; } return head; } 问题1:链表逆置 思想为:head 指针不断后移,指针反向即可,代码为: void reverse(node*& head) { if (head != NULL && head->next != NULL) { node* p = head; node* q = head->next; p->next = NULL; while (q->next != NULL) { head = q->next; q->next = p; p = q; q = head; } head->next = p; } return; } 问题2:删除不知头结点链表的某个节点 如果单向链表不知道头节点,一个指针指向其中的一个节点,问如何删除这个指针指向的节点? 思想为:把这个节点的下一个节点的值复制给该节点,然后删除下一个节点即可。 问题3:怎么判断链表中是否有环? 思想为:设置两个指针,一个步长为1,另一个步长为2,依次后移,如果相遇且都不为空,则有环。 与这个类似的问题包括:怎么快速检测出一个巨大的链表中的死链?或者如何找出一个单链表的中间节点? 代码为: bool loop(node* head) { bool flag = true; if (head == NULL) { flag = false; } node* one = head; node* two = head->next; if (two == NULL) { flag = false; } while (one != two) { if (one != NULL) { one = one->next; } if (two != NULL) { two = two->next; } if (two == NULL) { break; } two = two->next; if (one == NULL || two == NULL) { break; } } if (one == NULL || two == NULL) { flag = false; } return flag; } 问题4:如果一个单向链表,其中有环,怎么找出这个链表循环部分的第一个节点? 思想为:假设该节点在x 位置处,假设步长为1 的指针和步长为2 的指针相遇在x+z...