题目:
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}.
想法:将后半段倒序后,插入前半段
代码(c):
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
void reorderList(struct ListNode* head) {
struct ListNode* mid_head ;
struct ListNode* cur_ptr,*pre_ptr;
int i,length;
mid_head = (struct ListNode *)malloc(sizeof(struct ListNode));
mid_head->val = 0;
mid_head->next = NULL;
if(head != NULL)
{
length = 0;
cur_ptr = head;
while(cur_ptr!=NULL)
{
length++;
cur_ptr = cur_ptr->next;
}
for(i = 0, pre_ptr = cur_ptr = head; i<length;i++)
{
if(i>length/2&&cur_ptr!=NULL)
{
pre_ptr->next = cur_ptr->next;
cur_ptr->next = mid_head->next;
mid_head->next = cur_ptr;
cur_ptr = pre_ptr->next;
}
else
{
pre_ptr = cur_ptr;
cur_ptr = cur_ptr->next;
}
}
pre_ptr = head;
cur_ptr = mid_head->next;
while(cur_ptr!=NULL)
{
mid_head->next = cur_ptr->next;
cur_ptr->next = pre_ptr->next;
pre_ptr->next = cur_ptr;
pre_ptr = cur_ptr->next;
cur_ptr = mid_head->next;
}
}
}Runtime:16ms
本文介绍了一种链表重组算法,该算法将给定的单向链表重新排列为指定的交错模式,即首尾元素交替出现。通过计算链表长度并找到中点,将链表分为两部分,接着反转后半部分链表,并将其与前半部分交错连接起来。

被折叠的 条评论
为什么被折叠?



