15、剑指offer--反转链表
题目描述
输入一个链表,反转链表后,输出链表的所有元素。
解题思路:该题需要定义三个指针,分别记录当前结点、前一结点、下一结点。
反转过程中,先获得下一结点,然后让当前结点下一个指向前一结点,下一个前一结点为当前结点,当前结点为下一结点。注意如果下一结点为空,则当前结点为为最后一个结点,即返回的头指针。
1 #include <iostream> 2 #include <malloc.h> 3 using namespace std; 4 struct ListNode { 5 int val; 6 struct ListNode *next; 7 ListNode(int x) : 8 val(x), next(NULL) { 9 } 10 }; 11 class Solution { 12 public: 13 //需要定义三个指针、当前节点、前一个节点、后一个节点 14 ListNode* ReverseList(ListNode* pHead) { 15 ListNode *pre = NULL; 16 ListNode *pNode = pHead; 17 ListNode *pReverseHead = pHead; 18 while(pNode != NULL) 19 { 20 ListNode *pNext = pNode->next;//保存下一结点 21 if(pNext == NULL)//下一结点为空 22 { 23 pReverseHead = pNode;//当前结点为最后一个结点,即为返回的头指针 24 } 25 pNode->next = pre;//当前结点下一个指向前一个结点 26 pre = pNode;//前一结点为当前结点 27 pNode = pNext;//当前结点后移 28 29 } 30 return pReverseHead; 31 } 32 }; 33 ListNode *CreateList(int n) 34 { 35 ListNode *head; 36 ListNode *p,*pre; 37 int i; 38 head=(ListNode *)malloc(sizeof(ListNode)); 39 head->next=NULL; 40 pre=head; 41 for(i=1;i<=n;i++) 42 { 43 p=(ListNode *)malloc(sizeof(ListNode)); 44 cin>>p->val; 45 pre->next=p; 46 pre=p; 47 } 48 p->next=NULL; 49 50 return head->next; 51 } 52 /*-------------------------输出链表-----------------------------------*/ 53 void PrintList(ListNode *h) 54 { 55 ListNode *p; 56 57 p=h;//不带空的头结点 58 while(p) 59 { 60 cout<<p->val<<" "; 61 p=p->next; 62 cout<<endl; 63 } 64 } 65 int main() 66 { 67 int n1; 68 ListNode *h1; 69 cout<<"输入链表的结点数目"<<endl; 70 cin>>n1; 71 h1 = CreateList(n1); 72 cout<<"链表为:"<<endl; 73 PrintList(h1); 74 cout<<"反转后链表为:"<<endl; 75 Solution s; 76 h1 = s.ReverseList(h1); 77 PrintList(h1); 78 return 0; 79 }