關於單鏈表的翻轉問題頗爲困擾人。下面寫的程序只需遍歷每個節點一次,並且不需要構造輔助接點(通過new的方式)。
另外這個問題可以轉換爲一個循環鏈表結構,很有意思。
/////////////////////////////////////////////////////////////////////////
// .h
struct NODE{
NODE* next;
int data;
NODE(){
next = NULL;
data = 0;
}
};
class CDATAstruct
{
public:
CDATAstruct(void);
~CDATAstruct(void);
//------------------------------------------------
// 鏈表操作
static NODE * head;
static NODE * GenerateSingleLink(int num);
static void DeleteNode();
// 反轉鏈表
static NODE * RevertNode();
// 打印
static void ListNode();
static void ListNode(NODE* node);
};
/////////////////////////////////////////////////////////////////////////
cpp文件:
CDATAstruct::CDATAstruct(void)
{
}
CDATAstruct::~CDATAstruct(void)
{
}
NODE * CDATAstruct::head = NULL;
NODE * CDATAstruct::GenerateSingleLink(int num)
{
head = new NODE;
NODE* temp = head;
for ( int i=1; i<num; i++)
{
NODE* next = new NODE;
next->data = i;
temp->next = next;
temp = next;
}
return head;
}
void CDATAstruct::DeleteNode()
{
while (head != NULL)
{
NODE* temp = head;
head = head->next;
delete temp;
}
}
NODE * CDATAstruct::RevertNode()
{
if ( head == NULL )
return NULL;
NODE* temp = NULL;
NODE* Anode = head;
if ( NULL == Anode->next)
return Anode;
NODE* Bnode = Anode->next;
NODE* Cnode = NULL;
if ( NULL == Bnode->next)
{
Bnode->next = Anode;
Anode->next=NULL;
return Bnode;
}else{
Cnode = Bnode->next;
Bnode->next = Anode;
Anode->next=NULL;
}
NODE* now = Cnode;
while( NULL != now)
{
NODE* temp = now->next;
now->next = Bnode;
Bnode = now;
now = temp;
}
return Bnode;
}
void CDATAstruct::ListNode()
{
if (head == NULL )
{
AfxMessageBox( _T("no nodes") );
return;
}
CString output;
NODE* temp = head;
while ( temp != NULL )
{
output.Format(_T("%s %d"), output, temp->data);
temp = temp->next;
}
AfxMessageBox( output );
}
void CDATAstruct::ListNode(NODE* node)
{
if (node == NULL )
{
AfxMessageBox( _T("no nodes") );
return;
}
CString output;
NODE* temp = node;
while ( temp != NULL )
{
output.Format(_T("%s %d"), output, temp->data);
temp = temp->next;
}
AfxMessageBox( output );
}
/////////////////////////////////////////////////////////////////////////
// 調用方法
CString output = _T("");
NODE* init = CDATAstruct::GenerateSingleLink(100);
CDATAstruct::ListNode();
// revert
NODE *revert = CDATAstruct::RevertNode();
CDATAstruct::ListNode(revert);
CDATAstruct::DeleteNode();