(四)反转链表

    技术2025-12-06  12

    目录

     

    一、思路

    二、代码

    三、测试

    四、总结


    一、思路

    反转链表,就是改变链表的结点指向,这里我们来分析以下需要的操作以及相应的注意点。

    1.反转链表需要将当前结点的指针域指向前驱结点,所以第一我们需要找到当前结点

    2.第二,需要找到前驱结点的地址

    3.这时,还有一个问题,那就是如果改变了当前结点的指向,那么我们的后继结点就会丢失,所以我们需要保存后继结点

    综上我们需要三个指针变量来表示这些关系

    二、代码

    #include<iostream> #include "malloc.h" using namespace std; typedef struct LNode { int data; struct LNode * next; }LNode, *LinkList ; int tail_create_heahLinked_List(LinkList & L,int n) { if( n <= 0) return 1; LinkList head = (LinkList)malloc(sizeof(LNode));//头结点的存储地址 if(NULL == head) return 1; //分配空间失败 L = head; //头指针L存储头结点P的地址,即头指针指向头结点 L->data = 0; //用头结点统计元素个数,刚开始为0个 L->next = NULL; //此时链表为空 LinkList temp = L; for(int i = 0;i<n;i++) { LinkList List_Node = (LinkList)malloc(sizeof(LNode)); scanf("%d",&List_Node->data); L->data++; List_Node->next = NULL; //每插入一个元素,头结点统计链表元素个数加一 temp->next = List_Node; //尾插法,即链表中的元素顺序与输入相同 temp = temp->next; if(i == n-1 ){ temp->next = NULL; } } return 0; } LinkList reverse_LinkList(LinkList L) { if( NULL == L || NULL == L->next || L->data == 0) return NULL; LinkList reversed_Head = NULL; LinkList self_Node = L->next; LinkList front_Node = NULL; while(self_Node != NULL) { LinkList next_Node = self_Node->next; if(next_Node == NULL) reversed_Head = self_Node; self_Node->next = front_Node; front_Node = self_Node; self_Node = next_Node; } //创建头结点 LinkList head_Node = (LinkList)malloc(sizeof(LNode)); head_Node->next = reversed_Head; head_Node->data = L->data; free(L); LinkList new_LinkList = head_Node; return new_LinkList; } void headlinked_List_Traverse(LinkList L) { cout<<"该链表的元素个数为:"<<L->data<<endl; LinkList p = L->next; while(p) { cout<<p->data<<" "; p = p->next; } cout<<endl; } int destroy_linked_list(LinkList L) { LinkList p; while(L) { p = L->next; free(L); L = p; } cout<<"销毁链表成功"<<endl; return 0; } int main() { int num; cin>>num; LinkList L =NULL; if(!tail_create_heahLinked_List(L,num)) { headlinked_List_Traverse(L);//打印链表 LinkList middle_Node =NULL; L = reverse_LinkList(L); headlinked_List_Traverse(L); } else cout<<"请输入大于0的整数"<<endl; destroy_linked_list(L); return 0; }

     

    三、测试

     

    0 请输入大于0的整数 -2 请输入大于0的整数 3 1 2 3 该链表的元素个数为:3 1 2 3 该链表的元素个数为:3 3 2 1 6 1 2 3 4 5 6 该链表的元素个数为:6 1 2 3 4 5 6 该链表的元素个数为:6 6 5 4 3 2 1 5 23 45 12 56 78 该链表的元素个数为:5 23 45 12 56 78 该链表的元素个数为:5 78 56 12 45 23

     

    四、总结

    注意结点间的逻辑关系,看不出来的话,画图分析最简单的例子,比如只有一个结点。

    Processed: 0.009, SQL: 9