【12.8 4】编写一个函数,反序排列一个单链表中所有的节点。函数应该具有下面的原型:
struct NODE *sll_reverse(struct NODE *first);
在头文件singly_linked_list_node.h中声明节点数据结构。函数的参数指向链表的第一个节点。当链表被重排之后,函数返回一个指向链表新头节点的指针,链表最后一个节点的link字段的值应设置为NULL,在空链表(first == NULL)上执行这个函数将返回NULL。
实现单链表的反转方法有很多种,这里就一一讨论一下各个版本的实现:
- 版本一:(直接反转法)
思想:每次把原链表还没有移动的第一个节点移动到最前面。
操作起来需要几个2个辅助指针。
Node * sll_reverse(Node *head) {
if(head == NULL) {
return NULL;
}
//2个辅助指针用于移除某个节点,插入到头部
Node *current;
Node *next;
current = head;
next = head->link;
while(next != NULL) {
//移除next节点
current->link = next->link;
//将移除的next节点插入表头
next->link = head;