鏈表反轉是面試筆試常考題目,直接貼代碼。
反轉函數如下:
- //思路爲將節點從前到後依次放到表頭,最後最後的節點到了最前面,最前面的節點到了最後面
- ListNode * ReverseList(ListNode * head)
- {
- //如果鏈表爲空或者鏈表中只有一個元素
- if(head==NULL || head->m_pNext==NULL)
- return head;
- ListNode * p=head->m_pNext;
- ListNode * q=head;
- while(p!=NULL)
- {
- q->m_pNext=p->m_pNext;//記錄下p的下一個節點
- p->m_pNext=head;
- head=p;
- p=q->m_pNext;//準備將p的下一個節點放到表頭
- }
- return head;
- }
- //遞歸方式
- ListNode * ReverseList2(ListNode * head)
- {
- //如果鏈表爲空或者鏈表中只有一個元素
- if(head==NULL || head->m_pNext==NULL)
- return head;
- else
- {
- ListNode * newhead=ReverseList2(head->m_pNext);//先反轉後面的鏈表
- head->m_pNext->m_pNext=head;//再將當前節點設置爲其然來後面節點的後續節點
- head->m_pNext=NULL;
- return newhead;
- }
- }
整體測試代碼如下:
- // 反轉鏈表.cpp : 定義控制檯應用程序的入口點。
- #include "stdafx.h"
- #include <iostream>
- using namespace std;
- //定義一個鏈表節點
- typedef struct ListNode
- {
- int m_nKey;
- struct ListNode * m_pNext;
- }ListNode;
- //插入一個新節點到鏈表中(放在鏈表頭部)
- void CreateList(ListNode * & head,int data)
- {
- //創建新節點
- ListNode * p=(ListNode*)malloc(sizeof(ListNode));
- p->m_nKey=data;
- p->m_pNext=NULL;
- if(head==NULL)
- {
- head=p;
- return;
- }
- p->m_pNext=head;
- head=p;
- }
- void printList(ListNode* head)
- {
- ListNode * p=head;
- while(p!=NULL)
- {
- cout<<p->m_nKey<<" ";
- p=p->m_pNext;
- }
- cout<<endl;
- }
- //思路爲將節點從前到後依次放到表頭,最後最後的節點到了最前面,最前面的節點到了最後面
- ListNode * ReverseList(ListNode * head)
- {
- //如果鏈表爲空或者鏈表中只有一個元素
- if(head==NULL || head->m_pNext==NULL)
- return head;
- ListNode * p=head->m_pNext;
- ListNode * q=head;
- while(p!=NULL)
- {
- q->m_pNext=p->m_pNext;//記錄下p的下一個節點
- p->m_pNext=head;
- head=p;
- p=q->m_pNext;//準備將p的下一個節點放到表頭
- }
- return head;
- }
- //遞歸方式
- ListNode * ReverseList2(ListNode * head)
- {
- //如果鏈表爲空或者鏈表中只有一個元素
- if(head==NULL || head->m_pNext==NULL)
- return head;
- else
- {
- ListNode * newhead=ReverseList2(head->m_pNext);//先反轉後面的鏈表
- head->m_pNext->m_pNext=head;//再將當前節點設置爲其然來後面節點的後續節點
- head->m_pNext=NULL;
- return newhead;
- }
- }
- int _tmain(int argc, _TCHAR* argv[])
- {
- ListNode * Head=NULL;
- for(int i=0;i<10;i++)
- CreateList(Head,i);
- printList(Head);
- Head=ReverseList(Head);
- printList(Head);
- system("PAUSE");
- return 0;
- }
運行結果如下: