LeetCode:Reorder List

题目(题目链接):

Given a singly linked list LL0L1→…→Ln-1Ln,
reorder it to: L0LnL1Ln-1L2Ln-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}.

分析:先用快慢指针找到链表的中点,然后翻转链表后半部分,再和前半部分组合。需要注意的是把链表分成两半时,前半段的尾节点要置为NULL,翻转链表时也要把尾节点置为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         // IMPORTANT: Please reset any member data you declared, as
13         // the same Solution instance will be reused for each test case.
14         if(head == NULL || head->next == NULL)return;
15         ListNode *fastp = head, *lowp = head, *tail = NULL;
16         while(fastp != NULL && fastp->next != NULL)
17         {//利用快慢指针找到链表的中点
18             tail = lowp;
19             fastp = fastp->next->next;
20             lowp = lowp->next;
21         }
22         tail->next = NULL; //此时tail 指向前半段的结尾
23         reverseList(lowp);//翻转链表后半段
24         fastp = head;
25         tail = NULL;
26         while(fastp != NULL)
27         {
28             ListNode *tmp = lowp->next;
29             lowp->next = fastp->next;
30             fastp->next = lowp;
31             tail = lowp;
32             fastp = lowp->next;
33             lowp = tmp;
34         }
35         if(lowp != NULL)
36             tail->next = lowp;
37 
38     }
39     void reverseList(ListNode* &head)
40     {//翻转链表
41         if(head == NULL || head->next == NULL)return;
42         ListNode *pre = head, *p = pre->next;
43         while(p != NULL)
44         {
45             ListNode *tmp = p->next;
46             p->next = pre;
47             pre = p;
48             p = tmp;
49         }
50         head->next = NULL;
51         head = pre;
52     }
53 };

扩展:如果不是链表是数组怎么样得到相同的序列,请参考博客 here 完美洗牌算法

【版权声明】转载请注明出处:http://www.cnblogs.com/TenosDoIt/p/3416938.html

原文地址:https://www.cnblogs.com/TenosDoIt/p/3416938.html