單鏈表翻轉

關於單鏈表的翻轉問題頗爲困擾人。下面寫的程序只需遍歷每個節點一次,並且不需要構造輔助接點(通過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();

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章