實現單鏈表反轉主要思路:
- 三個節點,開始時中間節點指向頭結點,第一個節點指向NULL,第三個節點指向頭結點下個節點。
- 將中間節點反轉
- 三個節點均向後移動一格
- 判斷是否是結束條件
需要注意的是:鏈表在使用結束後,需要釋放內存(如果是new的要delete,malloc的要free)
具體代碼如下所示(包含遞歸和非遞歸兩種方法):
#pragma once
#ifndef LIST_H
#define LIST_H
#include <iostream>
using namespace std;
struct ListNode
{
int val;
ListNode* next;
ListNode():val(0),next(NULL){};
ListNode(int value):val(value),next(NULL){};
};
//構造帶頭結點的鏈表
int InitList(ListNode* head)
{
if (head ==NULL)
return -1;
ListNode* headBak = head;
for (int i=1;i<10;i++)
{
ListNode* node = new ListNode(i);
head->next = node;
head = head->next;
}
for (int j=0;j<10;j++)
{
cout<<headBak->val<<"->";
headBak = headBak->next;
}
cout<<endl;
return 0;
}
//逆序單鏈表--非遞歸實現
ListNode* ReverseLink(ListNode* head)
{
ListNode* pPrev = NULL;
ListNode* p = head;
ListNode* pNext = NULL;
//交換前面兩個節點
if (head == NULL)
return NULL;//不存在節點
ListNode* pReverseHead = NULL;
while (p !=NULL)
{
pNext = p->next;
if (pNext == NULL)
pReverseHead = p;
p->next = pPrev;
pPrev = p;
p = pNext;
}
return pReverseHead;
}
//逆序單鏈表--遞歸實現
ListNode* ReverseList(ListNode* p, ListNode* &head)
{
if (p == NULL || p->next == NULL)
{
head = p;
return p;
}
else
{
ListNode* tmp = ReverseList(p->next,head);
tmp->next = p;
return p;
}
//0->1->2->3->4->5->6->7->8->9
//程序結束之後0->1,1->0
}
//逆序輸出單鏈表元素
int PrintReverseList(ListNode* head)
{
if (head == NULL)
return 0;
PrintReverseList(head->next);
cout<<head->val<<"->";
}
//注意鏈表使用結束時要釋放內存
int DeleteList(ListNode* head)
{
if (head ==NULL)
return 0;
cout<<"釋放鏈表:";
ListNode* p = head;
while (p != NULL)
{
ListNode* pTmp = p->next;
cout<<p->val<<"->";
delete(p);
p = pTmp;
}
cout<<endl;
return 0;
}
//打印函數
void PrintNode(ListNode* node)
{
for (;node!=NULL;)
{
cout<<node->val<<"->";
node = node->next;
}
cout<<endl;
}
#endif
// ReverseLink.cpp : 定義控制檯應用程序的入口點。
//
#include "stdafx.h"
#include "list.h"
int _tmain(int argc, _TCHAR* argv[])
{
ListNode* head = new ListNode();
InitList(head);
//逆序輸出鏈表的值
PrintReverseList(head);
cout<<endl;
cout<<"=============================="<<endl;
//倒置鏈表
ListNode* newHead = ReverseLink(head);
PrintNode(newHead);
cout<<"=============================="<<endl<<endl;;
cout<<"******************************"<<endl;
ListNode* h = new ListNode();
PrintNode(newHead);
cout<<"=============================="<<endl;
//0->1->2->3->4->5->6->7->8->9
//程序結束之後0->1,1->0
ListNode* pOldHead = ReverseList(newHead,h);
pOldHead->next = NULL;
PrintNode(h);
cout<<"=============================="<<endl;
//鏈表釋放內存
DeleteList(head);
return 0;
}