143. Reorder List

Given a singly linked list LL0→L1→…→Ln-1→Ln,
reorder it to: L0→LnL1→Ln-1→L2→Ln-2→…

You may not modify the values in the list's nodes, only nodes itself may be changed.

Example 1:

Given 1->2->3->4, reorder it to 1->4->2->3.

Example 2:

Given 1->2->3->4->5, reorder it to 1->5->2->4->3.

【题意】

按照规则,重新连接一个链表,不可以改变链表里面元素的值。

【思路】

两个指针,一个指向Li,一个指向Ln-i,改变指针的连接即可。但是需要记录Li->next和Ln-i的previous,因为这就是下一次循环的Li和Ln-i。当Li->next==Ln-i时候连接不需要改变,或Li==Ln-i时候,所有元素已经连接完,此时break。
有一个容易忘掉的地方就是修改完所有的结点连接后,需要将尾结点的next指向NULL。(这个我就忘了,结果构造了一个循环数组…

O(n2)  T(1)

【代码】

class Solution {
public:
    void reorderList(ListNode* head) {
        ListNode* p1 = head;
        ListNode* p2 = head;
        if(head == NULL || head->next==NULL) return ; 
        while(p2->next != NULL){
            p2 = p2->next;
        }
        while(p1->next!=p2 && p1!=p2){
            ListNode* p1Next = p1->next;
            ListNode* p2Pre = p1->next;
            while(p2Pre->next != p2)
                p2Pre = p2Pre->next;
            p1->next = p2;
            p2->next = p1Next;
            p1 = p1Next;
            p2 = p2Pre;
        }
        p2->next = NULL;
    }
};

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值