Reorder List

简介: 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.

Given a singly linked list LL0→L1→…→Ln-1→Ln,
reorder it to: L0→LnL1→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++代码实现:

#include<iostream>
#include<new>
using namespace std;

//Definition for singly-linked list.
struct ListNode
{
    int val;
    ListNode *next;
    ListNode(int x) : val(x), next(NULL) {}
};
class Solution
{
public:
    void reorderList(ListNode *head)
    {
        //开始的代码因为没有加入head->next==NULL而不被接受
        if(head==NULL||head->next==NULL)
            return;
        int len=0;
        ListNode *l1=head;
        ListNode *l2=NULL;
        while(l1)
        {
            len++;
            l1=l1->next;
        }
        len=(len+1)/2;
        l1=head;
        while(--len)
        {
            l1=l1->next;
        }
        if(l1->next==NULL)
            return;
        l2=l1->next;
        l1->next=NULL;
        ListNode *p=l2->next;
        l2->next=NULL;
        ListNode *q=NULL;
        while(p)
        {
            q=p->next;
            p->next=NULL;
            p->next=l2;
            l2=p;
            p=q;
        }
        l1=head;
        p=l2;
        while(l1&&l2)
        {
            l2=l2->next;
            p->next=NULL;
            p->next=l1->next;
            l1->next=p;
            p=l2;
            l1=l1->next->next;
        }
    }
    void createList(ListNode *&head)
    {
        ListNode *p=NULL;
        int i=0;
        int arr[11]= {10,9,8,7,6,5,4,3,2,1};
        for(i=0; i<10; i++)
        {
            if(head==NULL)
            {
                head=new ListNode(arr[i]);
                if(head==NULL)
                    return;
            }
            else
            {
                p=new ListNode(arr[i]);
                p->next=head;
                head=p;
            }
        }
    }
};

int main()
{
    Solution s;
    ListNode *L=NULL;
    s.createList(L);
    ListNode *head=L;
    while(head)
    {
        cout<<head->val<<" ";
        head=head->next;
    }
    cout<<endl;
    s.reorderList(L);
    while(L)
    {
        cout<<L->val<<" ";
        L=L->next;
    }
}

运行结果:

开始提交时报错,

Input:    {1}
Output:    1
Expected:    {1}

没看懂,在刚开始的判断条件中加了

head->next==NULL 就通过了。
相关文章
LeetCode 143. Reorder List
给定一个单链表 L:L0→L1→…→Ln-1→Ln , 将其重新排列后变为: L0→Ln→L1→Ln-1→L2→Ln-2→… 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
135 0
LeetCode 143. Reorder List
|
开发工具 C++
LeetCode 143 Reorder List(重排序链表)(Linked List)(*)
版权声明:转载请联系本人,感谢配合!本站地址:http://blog.csdn.net/nomasp https://blog.csdn.net/NoMasp/article/details/52176455 翻译 给定一个链表: L0→L1→…→Ln-1→Ln, 将其重排序成: L0→Ln→L1→Ln-1→L2→Ln-2→… 你必须不改变节点的值就地解决这个问题。
999 0
|
存储
[LeetCode] Reorder List
Given a singly linked list L: L0→L1→…→Ln−1→LnL_0→L_1→…→L_{n-1}→L_n, reorder it to: L0→Ln→L1→Ln−1→L2→Ln−2→…L_0→L_n→L_1→L_{n-1}→L_2→L_{n-2}→… You must do this in-place without altering the
1355 0
[LeetCode 第9题] -- Reorder List
题目链接: Reorder List 题目意思: 给的一个链表,要求对链表重新排序。                 例如L0->L1->L2....
1068 0
|
安全 Java
java线程之List集合并发安全问题及解决方案
java线程之List集合并发安全问题及解决方案
1859 1
|
运维 关系型数据库 Java
PolarDB产品使用问题之使用List或Range分区表时,Java代码是否需要进行改动
PolarDB产品使用合集涵盖了从创建与管理、数据管理、性能优化与诊断、安全与合规到生态与集成、运维与支持等全方位的功能和服务,旨在帮助企业轻松构建高可用、高性能且易于管理的数据库环境,满足不同业务场景的需求。用户可以通过阿里云控制台、API、SDK等方式便捷地使用这些功能,实现数据库的高效运维与持续优化。
|
Java API Apache
怎么在在 Java 中对List进行分区
本文介绍了如何将列表拆分为给定大小的子列表。尽管标准Java集合API未直接支持此功能,但Guava和Apache Commons Collections提供了相关API。
543 1
|
存储 安全 Java
详解Java中集合的List接口实现的ArrayList方法 | Set接口实现的HashSet方法
详解Java中集合的List接口实现的ArrayList方法 | Set接口实现的HashSet方法
335 3
|
Java API
使用 Java 来实现两个 List 的差集操作
使用 Java 来实现两个 List 的差集操作
1647 3