码迷,mamicode.com
首页 > 其他好文 > 详细

【链表】143. 重排链表

时间:2020-05-01 22:38:26      阅读:73      评论:0      收藏:0      [点我收藏+]

标签:需要   单链表   link   ast   nod   struct   init   font   pre   

题目:

给定一个单链表 L:L0→L1→…→Ln-1→Ln ,
将其重新排列后变为: L0→Ln→L1→Ln-1→L2→Ln-2→…

你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。

示例 1:

给定链表 1->2->3->4, 重新排列为 1->4->2->3.
示例 2:

给定链表 1->2->3->4->5, 重新排列为 1->5->2->4->3.

 

 

解法:

方法一:把链表存储到线性表中,然后用双指针依次从头到尾取元素即可。

 

方法二:主要利用一头一尾取元素的特性。

主要是三步,举个例子。

1 -> 2 -> 3 -> 4 -> 5 -> 6
第一步,将链表平均分成两半
1 -> 2 -> 3
4 -> 5 -> 6

第二步,将第二个链表逆序
1 -> 2 -> 3
6 -> 5 -> 4

第三步,依次连接两个链表
1 -> 6 -> 2 -> 5 -> 3 -> 4

第一步找中点的话,快慢指针。

第二步链表逆序的话,有迭代和递归的两种,迭代的话,主要是利用两个指针,依次逆转。

第三步,两个指针分别往后移动就可以了。

 

 1 /**
 2  * Definition for singly-linked list.
 3  * struct ListNode {
 4  *     int val;
 5  *     ListNode *next;
 6  *     ListNode() : val(0), next(nullptr) {}
 7  *     ListNode(int x) : val(x), next(nullptr) {}
 8  *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 9  * };
10  */
11 class Solution {
12 public:
13     void reorderList(ListNode* head) 
14     {
15         if (NULL == head || NULL == head->next || NULL == head->next->next)
16         {
17             return;
18         }
19 
20         // 找中点, 链表分成两个
21         ListNode *slow = head;
22         ListNode *fast = head;
23         while (fast != NULL && fast->next != NULL)
24         {
25             slow = slow->next;
26             fast = fast->next->next;
27         }
28         ListNode *newhead = slow->next;
29         slow->next = NULL;
30 
31         // 链表倒置
32         newhead = reverseList(newhead);
33 
34         // 链表节点依次连接
35         while (newhead != NULL)
36         {
37             ListNode *temp = newhead->next;
38             newhead->next = head->next;
39             head->next=newhead;
40             head = newhead->next;
41             newhead = temp;   
42         }      
43     }
44 
45     ListNode* reverseList(ListNode* head) {
46         ListNode *p1;
47         ListNode *p2;
48         ListNode *p3;
49 
50         // 链表为空, 或者单节点链表直接返回头部
51         if (NULL == head || NULL == head->next)
52         {
53             return head;
54         }
55 
56         p1 = head;
57         p2 = head->next;
58 
59         while (p2 != NULL)
60         {
61             p3 = p2->next;
62             p2->next = p1;
63             p1 = p2;
64             p2 = p3;
65         }
66 
67         head->next = NULL;
68         head = p1;
69 
70         return head;
71     }
72 
73 };

 

【链表】143. 重排链表

标签:需要   单链表   link   ast   nod   struct   init   font   pre   

原文地址:https://www.cnblogs.com/ocpc/p/12814973.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!