Talk is cheap, show your code!
struct Node
{
int data;
Node* m_pNext;
Node(int d):data(d){m_pNext = NULL;}
};
1. 從前遍歷到尾,依次反轉指針的指向,原來的頭指針的下一結點設置爲空,原來的尾結點變成頭結點返回。
Node* Reverse(Node*& head)
{
if(head == NULL)
{
return head;
}
Node* pre = NULL;
Node* cur = head;
Node* nex;
while(cur)
{
nex = cur->m_pNext;
cur->m_pNext = pre;
pre = cur;
cur = nex;
}
return head = pre;
}
2. 設置一個新的空鏈表,然後每次從原來的鏈表中取出最前面的元素,插入到這個新的鏈表之中,直到最後一個元素。
Node* Reverse2(Node*& head)
{
if (head == NULL) return head;
Node* pList = NULL; // 新的空鏈表。
Node* cur = head;
while(cur)
{
Node* Tmp = cur->m_pNext;
cur->m_pNext = pList;
pList = cur;
cur = Tmp;
}
return head = pList;
}
3. 採用遞歸。
Node* Reverse3(Node* head)
{
if (head == NULL || head->m_pNext == NULL)
return head;
Node* p = Reverse3(head->m_pNext);
head->m_pNext->m_pNext = head;
head->m_pNext = NULL;
return p;
}
這種遞歸的方式,需要注意的是,執行完後head不再有用。