1 class Solution { 2 public: 3 ListNode* reverseList(ListNode* head) { 4 if(head==NULL) 5 return head; 6 ListNode* pre=head; 7 ListNode* mid=head->next; 8 ListNode* tail; 9 head->next=NULL; 10 while(mid!=NULL) 11 { 12 tail=mid->next; 13 mid->next=pre; 14 pre=mid; 15 mid=tail; 16 } 17 return pre; 18 } 19 };
考虑链表为空的情况,解决方法可以是迭代改变每个节点的next指针
完整代码:
1 #include <iostream> 2 #include <string> 3 #include <vector> 4 #include <algorithm> 5 #include <map> 6 using namespace std; 7 typedef struct ListNode { 8 int val; 9 ListNode *next; 10 ListNode(int x) : val(x), next(NULL) {} 11 }ListNode; 12 class Solution { 13 public: 14 ListNode* reverseList(ListNode* head) { 15 if(head==NULL) 16 return head; 17 ListNode* pre=head; 18 ListNode* mid=head->next; 19 ListNode* tail; 20 head->next=NULL; 21 while(mid!=NULL) 22 { 23 tail=mid->next; 24 mid->next=pre; 25 pre=mid; 26 mid=tail; 27 } 28 return pre; 29 } 30 }; 31 ListNode* ListInsert(int d) 32 { 33 ListNode* cur=NULL; 34 cur=(ListNode*)malloc(sizeof(ListNode)); 35 cur->val=d; 36 cur->next=NULL; 37 return cur; 38 } 39 int main() 40 { 41 int n; 42 while(cin>>n) 43 { 44 Solution sol; 45 int i,d; 46 ListNode *head=NULL,*tail=NULL,*cur; 47 tail=(ListNode*)malloc(sizeof(ListNode)); 48 for(i=0;i<n;i++) 49 { 50 cin>>d; 51 cur=ListInsert(d); 52 if(i==0) 53 { 54 head=cur; 55 tail=cur; 56 } 57 else 58 { 59 tail->next=cur; 60 tail=cur; 61 } 62 } 63 ListNode* h=sol.reverseList(head); 64 while(h!=NULL) 65 { 66 cout<<h->val<<" "; 67 h=h->next; 68 } 69 cout<<endl; 70 } 71 return 0; 72 }
1、定义节点指针,使用前需要malloc分配内存?
指针在使用时需要指向一块内存,不使用则可以指向任何地方
2 、55行tail=cur; 若直接在46行初始化tail=head, 删去55行代码,head不能自动连接到下一个节点?
因为在为tail分配内存后tail不再指向head,所以删去55行代码,head不能自动连接到下一个节点