您的位置:首页 > 其它

实现单链表的逆置或叫翻转

2015-07-04 14:51 316 查看
链表的问题一直不能很轻松地想明白,其实主要是理解链表结点的结构,以及他是如何进行遍历和指针变换的。

单链表的逆置,需要使用额外的三个指针,分别指向当前遍历到的结点、他的前一个结点,以及他的后一个结点。分别定义为 Current,Pre,pNext;这三个指针同时进行链表的下行,直到第三个指针指向表尾NULL;最后返回最后一个结点的位置;

下面是具体代码,请作参考:

// ReverseListNode.cpp : 定义控制台应用程序的入口点。
/*
@mishidemudong
@2015-7-4-14:50
*/
//

#include "stdafx.h"
#include<iostream>
#include<stdlib.h>
using namespace std;
struct ListNode
{
int			m_value;
ListNode  *m_pNext;
};

ListNode* ReverseList(ListNode* pHead)
{
ListNode* Current = pHead;
ListNode* Pre = NULL;
ListNode* ReverseListNode = NULL;

while (Current != NULL)				//遍历链表所有的结点;
{
ListNode* pNext = Current->m_pNext;  //先保存下一个结点的地址,三个指针始终跑在最前面
if (pNext == NULL)
ReverseListNode = Current;
Current->m_pNext = Pre;   //实现翻转,即中间的结点的m_pNext指向前一个位置,或叫三个当中第一个结点;
Pre = Current;						//更新第一个结点进行前移;
Current = pNext;					//更新中间的结点进行前移;
}
return ReverseListNode;
}

void PrintList(ListNode* pHead)
{
if (pHead == NULL)
cout << "The List is empty!";
else
{
ListNode* p = pHead;
while (p != NULL)
{
cout << p->m_value << "    ";
p = p->m_pNext;
}
cout << endl;
}
}

ListNode *CreateList()
{
int value, n;
ListNode *pHead;
ListNode *Current=NULL;
ListNode*pNext=NULL;
pHead = NULL;
printf("请输入您要建立的链表长度:\n");
scanf_s("%d", &n);
printf("请输入您要输入的数据:\n");
for (int i = 0; i < n; ++i)
{
scanf_s("%d", &value);
Current = (ListNode*)new(ListNode);
Current->m_value = value;
if (pHead == NULL)
pNext = pHead = Current;
else
pNext->m_pNext = Current;
pNext = Current;
}
Current->m_pNext = NULL;
return pHead;
}

int _tmain(int argc, _TCHAR* argv[])
{
ListNode *p;
ListNode* pHead;
p = CreateList();
PrintList(p);
pHead = ReverseList(p);
printf("逆置之后的链表为:\n");
PrintList(pHead);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: