输入一个链表,反转链表后,输出链表的所有元素。
解题思路:
用三个指针分别指向当前结点pPrev,前结点pNode,后结点pNext。
如果当前结点为尾结点(当前结点的后结点为空时),则新的头结点指向该结点;
否则: 当前结点的指针指向前结点(指针反向)、前指针后移、当前指针后移。
#include<iostream>
using namespace std;
struct ListNode {
int val;
struct ListNode *next;
};
void MYPrint(ListNode *p) //打印链表
{
while(p!=NULL)
{
cout<<p->val<<" ";
p=p->next;
}
cout<<endl<<endl;
return;
}
ListNode* ReverseList( ListNode* pHead)
{
ListNode * pReverseHead=NULL; //新定义的结点,用于指向尾结点,作为反转后的头结点
ListNode * pNode = pHead; //当前结点
ListNode * pPrev = NULL; //当前结点的前结点
while(pNode!=NULL)
{
ListNode *pNext=pNode->next; //当前结点的下一个结点
if(pNext==NULL) //如果当前结点的下一个结点为空,则为尾结点。。即反转后的链表的头结点
pReverseHead=pNode;
pNode->next=pPrev; //当前结点不是尾结点,则将当前结点指针指向前结点(方向反向)
pPrev=pNode; //指针右移
pNode=pNext;
}
return pReverseHead;
}
int main()
{
int myarray[]={1,2,3,4,5,6,7};
int num=sizeof(myarray)/sizeof(int);
//将数组myarray中的内容传递给链表
//链表
ListNode *head,*p,*lins,*newHead; //首先建立一个头指针head指向链表的最开始。。当链表还没有建立的时候头指针为空。
head=NULL; //头指针初始为空
for(int i=0; i<=num-1; i++)
{
//建立一个结点,并用临时指针p指向这个结点。
p = new ListNode ;
p->val = myarray[i]; //将数据存储到当前结点的data域中
p->next = NULL; //设置当前结点的后继指针指向空,也就是当前结点的下一个结点为空。
if(head==NULL)
{
head=p; //如果这是第一个创建的结点,则将头指针指向这个结点
}
else
{
lins->next=p; //如果这不是第一个创建的结点,则将上一个结点的后继指针指向当前结点
}
lins=p; //指针lins也指向当前结点.
}
cout<<"链表内容为:"<<endl;
MYPrint(head);
cout<<"反转后链表内容为:"<<endl;
newHead=ReverseList(head);
MYPrint(newHead);
return 0;
}
运行结果为:
链表内容为:
1 2 3 4 5 6 7
反转后链表内容为:
7 6 5 4 3 2 1