您的位置:首页 > 其它

leetcode. Reorder List

2014-12-06 10:42 344 查看
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}
.

1、通过双指针法得到链表中点,从而得到左右两个链表

2、将链表右半边逆序

3、合并两个链表

void reorderList(ListNode *head)
{
if (head == NULL || head->next == NULL || head->next->next == NULL)
return;

ListNode *p, *q, *dummy = new ListNode(INT_MIN);
q = head;
p = q->next;
while (p != NULL)
{
q = q->next;
p = p->next;
if (p != NULL)
p = p->next;
}

dummy->next = q->next; // right half nodes
q->next = NULL;
q = head;   // left half nodes
reverse(dummy);

while (q != NULL)
{
p = dummy->next;
dummy->next = p->next;
p->next = q->next;
q->next = p;
q = q->next;
q = q->next;
if (dummy->next == NULL)
break;
}
delete dummy;
}

void reverse(ListNode *dummy)
{
ListNode *p = dummy, *q, *r;

q = p->next;
if (q == NULL)
return;
r = q->next;
while (r != NULL)
{
q->next = p;
p = q;
q = r;
r = r->next;
}
q->next = p;
dummy->next->next = NULL;
dummy->next = q;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: