反转单链表——16
定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点。
要反转一个单链表也就是使链表中的结点逆置,但并不是遍历链表每一次都将结点重新创建进行头插,这样就是重新创建一个单链表了而不是将原有的单链表逆置;因此,可以想到用多个指针来操控,既要防止找不到下一个结点的问题,也要解决逆置链表的链接问题;
程序设计如下:
#include<iostream>#include<assert.h>usingnamespacestd;template<classT>structListNode//链表结点结构{T_data;ListNode<T>*_next;};template<classT>ListNode<T>*buy_node(Tdata)//创建一个链表结点{ListNode<T>*tmp=newListNode<T>;tmp->_data=data;tmp->_next=NULL;returntmp;}template<classT>voidinit_list(ListNode<T>**node,Tdata)//初始化链表{*node=buy_node(data);}template<classT>voidpush_node(ListNode<T>*&head,Tdata)//插入链表结点{if(head==NULL){init_list(&head,data);return;}ListNode<T>*tmp=head;while(tmp->_next!=NULL){tmp=tmp->_next;}tmp->_next=buy_node(data);}template<classT>voidprint_list(ListNode<T>*head)//打印链表{while(head!=NULL){cout<<head->_data<<"->";head=head->_next;}cout<<"NULL"<<endl;}template<classT>voiddestroy_list(ListNode<T>*&head)//销毁链表{if(head!=NULL){ListNode<T>*cur=head;ListNode<T>*tmp=head;while(cur!=NULL){tmp=cur;cur=cur->_next;deletetmp;}head=NULL;}}template<classT>ListNode<T>*ReverseList(ListNode<T>*head)//逆置链表{if(head==NULL)//条件判断returnhead;ListNode<T>*newHead=NULL;ListNode<T>*cur=head;ListNode<T>*tmp=head;while(cur!=NULL){tmp=cur;//将当前结点交给tmpcur=cur->_next;//指向当前结点的下一个结点,防止丢失找不到tmp->_next=newHead;//使当前结点的next结点指向新的头结点完成头插newHead=tmp;//更新链表的头结点}returnnewHead;}intmain(){ListNode<int>*list=NULL;push_node(list,1);push_node(list,2);push_node(list,3);push_node(list,4);push_node(list,5);push_node(list,6);push_node(list,7);push_node(list,8);push_node(list,9);cout<<"list:";print_list(list);ListNode<int>*newhead=ReverseList(list);cout<<"reverselist:";print_list(newhead);destroy_list(list);return0;}
运行程序:
《完》
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。