反转单链表

将一个单链表反向。即:让原来的前一结点成为后一结点,原来的头结点成为尾结点,原来的尾结点成为头结点。

 

listnode.h

struct Listnode
{
 int mvalue;
 Listnode *pnext;
};

 

creatlist.cpp

#include <iostream>
#include "listnode.h"
using namespace std;

ListNode* creatlist()
{
 ListNode *pHead=new ListNode();
 ListNode *p1=pHead;
 
 int mval=0;
 while((mval+1)!=0)
 {
  cin>>mval;
  ListNode *pnode=new ListNode();
  pnode->mvalue=mval;
  pnode->pnext=NULL;
  
  p1->pnext=pnode;
  p1=pnode;
 }
 pHead=pHead->pnext;
 return pHead;
}

 

#include <iostream>
#include "creatlist.cpp"
using namespace std;

ListNode* reverselist(ListNode* pHead);

int main()
{
 ListNode *pHead=creatlist();
 ListNode *p1=pHead;
 while(p1!=NULL)
 {
  cout<<p1->mvalue <<" " ;
  p1=p1->pnext;
 }
 cout <<endl;

 ListNode *pNewHead=reverselist(pHead);
 ListNode *p2=pNewHead;
 while(p2!=NULL)
 {
  cout<<p2->mvalue <<" " ;
  p2=p2->pnext;
 }
 cout <<endl;

 return 0;
}

//反转链表时,要将当前结点的pnext指针指向其前一个结点,因此需要找到当前结点和其前一结点;
//同时,改变了链表结点的指针指向之后,为了防止链表断裂,需要事先保存当前结点的后一结点。
//因此,为了反转链表,至少需要三个指针,分别指向当前结点和其前后结点
//另外要注意:一定要把原链表的尾结点赋为新链表的头结点
ListNode* reverselist(ListNode* pHead)
{
 ListNode *pnewHead=NULL;
 ListNode *pre=NULL;
 ListNode *cur=pHead;

 while(cur!=NULL)
 {
  ListNode *pnext=cur->pnext;//反转之前,事先保存当前结点的后一结点
  
  //如果当前结点为尾结点,则其就是新链表的头结点
  if (pnext==NULL)
  {
   pnewHead=cur;
  }

  cur->pnext=pre;//反转指针指向

  //反转之后,将当前结点指针后移
  pre=cur;
  cur=pnext;
 }
 return pnewHead;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值