标签:需要 单链表 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 };
标签:需要 单链表 link ast nod struct init font pre
原文地址:https://www.cnblogs.com/ocpc/p/12814973.html