标签:
关于List换位置移动,一个很好的解决途径就是 使用 vector 来储存 ListNode *, 然后可以方便的计算其长度 v.size() 并且进行移动,删改等操作。
注意:
1. 其实vector操作和真实指针移动操作的时间差不太多。
2. 还要记得判断head是否为NULL
3. 在使用 v->next = ....先思考一下,v到底存不存在,也就是有没有v->next 的可能性.
4. 如果每次都要判断给head赋值时是否为空,还不如增加个新的fakenode的节点。
5. ListNode *p;
delete p;
delete 只是删除那个指针,并没有删除那个指针所指向的数值。
思路一:
利用分界值,和两个vector来分别存储小于 x 和大于等于x的pointer,然后在把存大值的vector 放到小的那个vector 里面,重新进行链接。
思路二:
新开两个list,然后操作类似于vector.
1 class Solution { 2 public: 3 ListNode *partition(ListNode *head, int x) { 4 if(head == NULL) 5 return head; 6 7 std::vector<ListNode*> v1,v2; 8 int cnt,length; 9 length = 0; 10 ListNode * p = head; 11 while(p) 12 { 13 if(p->val < x) 14 v1.push_back(p); 15 else 16 v2.push_back(p); 17 p = p->next; 18 length ++; 19 } 20 21 for (int i=0;i<v2.size();i++) 22 v1.push_back(v2[i]); 23 24 ListNode *newhead; 25 newhead = p = v1[0]; 26 27 for(int i=0;i<length-1;i++) 28 v1[i]->next = v1[i+1]; 29 v1[length-1]->next = NULL; 30 return newhead; 31 } 32 };
思路二:
1 class Solution { 2 public: 3 ListNode *partition(ListNode *head, int x) { 4 if(head == NULL) 5 return head; 6 7 ListNode * p = head; 8 ListNode *head1, *p1, *head2, *p2; 9 int flag1, flag2; 10 flag1 = flag2 = 0; 11 while(p) 12 { 13 if(p->val < x) 14 { 15 if(flag1 == 0) 16 { 17 flag1 = 1; 18 p1 = head1 = p; 19 } 20 else 21 { 22 p1 ->next = p; 23 p1 = p1->next; 24 } 25 } 26 27 else 28 { 29 if(flag2 == 0) 30 { 31 flag2 = 1; 32 p2 = head2 = p; 33 } 34 else 35 { 36 p2 ->next = p; 37 p2 = p2->next; 38 } 39 } 40 p = p->next; 41 } 42 if(flag1 == 0) 43 { 44 p2 -> next =NULL; 45 return head2; 46 } 47 if (flag2 == 0) 48 { 49 p1 -> next = NULL; 50 return head1; 51 } 52 p1->next = head2; 53 p2 -> next = NULL; 54 ListNode *newhead; 55 56 return head1; 57 } 58 };
标签:
原文地址:http://www.cnblogs.com/zhuguanyu33/p/4419035.html