标签:des style blog io color ar sp for div
Given a singly linked list L: L0→L1→…→Ln-1→Ln,
reorder it to: L0→Ln→L1→Ln-1→L2→Ln-2→…
You must do this in-place without altering the nodes‘ values.
For example,
Given {1,2,3,4}
, reorder it to {1,4,2,3}
.
思路:
利用快慢指针的方式将链表分为前后两个部分,然后将后半部分的链表倒序重排,然后再每次先从第一个链表中取出头指针,再从第二个链表中取出头指针,将两个指针连接起来,按照这个顺序重新建立新链表。
但是,在具体实现的过程中,还是遇到了一点小问题。就是取出两个头指针后,一定要将其next值赋值为NULL,不然的话可能会因为边界情况生成有环的链表。
因为分割链表是所采取的策略是后半部分的链表长度一定大于等于前半部分的链表长度,所以最后只可能出现的情况是前半部分的链表结点已经全部取出来用于组成新链表了,而后半部分的链表节点还有剩余。所以出现这种情况时要将后半部分剩余的链表结点接在新链表后面。
上代码:
1 /** 2 * Definition for singly-linked list. 3 * struct ListNode { 4 * int val; 5 * ListNode *next; 6 * ListNode(int x) : val(x), next(NULL) {} 7 * }; 8 */ 9 class Solution { 10 public: 11 void reorderList(ListNode *head) { 12 if(!head||!head->next||!head->next->next) 13 return;//两个以下的结点,返回! 14 ListNode *fast,*slow; 15 fast=slow=head; 16 while(fast&&fast->next){ 17 fast=fast->next->next; 18 slow=slow->next; 19 } 20 ListNode *h1,*h2; 21 h1=head; 22 h2=slow; 23 slow=NULL; 24 ListNode *h3; 25 h3=NULL; 26 while(h2){ 27 ListNode *tmp=h2; 28 h2=h2->next; 29 tmp->next=NULL; 30 if(!h3){ 31 h3=tmp; 32 } 33 else 34 { 35 tmp->next=h3; 36 h3=tmp; 37 } 38 } 39 head=h1; 40 ListNode *tmp=NULL; 41 while(h1&&h3){ 42 ListNode *tmp1,*tmp2; 43 tmp1=h1; 44 tmp2=h3; 45 h1=h1->next;//这里很有必要 46 h3=h3->next;//这里很有必要 47 tmp1->next=NULL; 48 tmp2->next=NULL; 49 if(!tmp){ 50 tmp=tmp1; 51 } 52 else 53 { 54 tmp->next=tmp1; 55 tmp=tmp->next; 56 } 57 tmp->next=tmp2; 58 tmp=tmp->next; 59 } 60 if(!h1) 61 tmp->next=h3;//后半部分链表还有剩余结点,连接上去 62 63 64 65 } 66 };
标签:des style blog io color ar sp for div
原文地址:http://www.cnblogs.com/zhoudayang/p/4092958.html