重排链表

来源:互联网 发布:数据监控系统毕业设计 编辑:程序博客网 时间:2024/05/24 07:31

题目

给定一个单链表L: L0→L1→…→Ln-1→Ln,

重新排列后为:L0→Ln→L1→Ln-1→L2→Ln-2→…

必须在不改变节点值的情况下进行原地操作。
样例
给出链表 1->2->3->4->null,重新排列后为1->4->2->3->null。

解题

当程序不会写的时候考虑递归解决

第一个节点head
第二个节点headNext
最后一个节点lastNode
最后一个节点前驱节点lastPrevNode

将第一个节点和最后一个节点链接起来,中间节点递归解决
注意当只有一个节点或者两个节点的时候不做处理

public class Solution {    /**     * @param head: The head of linked list.     * @return: void     */    public void reorderList(ListNode head){        if(head==null || head.next==null){            return;        }        if(head.next.next ==null){            // 当只有两个节点时候也直接返回            return;        }        ListNode lastNode = head;        ListNode lastPrevNode = null;        while(lastNode.next!=null){            lastPrevNode = lastNode;            lastNode = lastNode.next;        }        ListNode headNext = head.next;        head.next = lastNode;        lastPrevNode.next = null;        reorderList(headNext);        lastNode.next = headNext;    }}
0 0