题解 | #重排链表#

重排链表

https://www.nowcoder.com/practice/3d281dc0b3704347846a110bf561ef6b

普通做法:用一个数组集合保存下来,然后按需遍历。

public class Solution {
    public void reorderList(ListNode head) {
        if(head==null) return;
//         初级:使用集合存储然后按需遍历
        List<ListNode> res = new ArrayList<>();
        ListNode node = head;
        while(node!=null){
            res.add(node);
            node = node.next;
        }
//         按需遍历,在原链表上修改
        int i = 0,j = res.size()-1;
        while(i<j){
            res.get(i).next = res.get(j);
            i++;
            if(i==j) break;
            res.get(j).next = res.get(i);
            j--;
        }
        res.get(i).next = null;
    }
}

进阶:不适用外部空间,找到中间节点截断;然后将后半部分翻转;最后两部分直接映射

public class Solution {
    public void reorderList(ListNode head) {
        if(head==null || head.next==null) return;
        // 找到中间节点
        ListNode mid = middle(head);
        // 后半部分节点位置
        ListNode l2 = reverse(mid.next);
        ListNode l1 = head;
        // 截取了
        mid.next = null;
        mapping(l1,l2);
    }
    // 考点:如何找到一个链表的中间节点?双指针
    public ListNode middle(ListNode head){
        ListNode slow = head,fast=head;
        while(fast.next!=null && fast.next.next!=null){
            slow = slow.next;
            fast = fast.next.next;
        }
        return slow;
    }
    // 考点:翻转链表,这里用递归的形式
    public ListNode reverse(ListNode node){
        if(node.next == null || node==null) return node;
        ListNode pre = reverse(node.next);
        node.next.next = node;
        node.next = null;
        return pre;
    }
    public void mapping(ListNode l1,ListNode l2){
        // 保留后一个节点
        ListNode l1Temp=null,l2Temp=null;
        while(l1!=null && l2!=null){
            l1Temp = l1.next;
            l2Temp = l2.next;
            l1.next = l2;
            l1 = l1Temp;
            l2.next = l1;
            l2 = l2Temp;
        }
    }
}
全部评论

相关推荐

04-14 20:10
已编辑
门头沟学院 Java
点赞 评论 收藏
分享
佛系的本杰明反对画饼:个人看法,实习经历那段是败笔,可以删掉,它和你目标岗位没什么关系,没有用到什么专业技能,甚至会降低你项目经历内容的可信度。个人技能那里可以再多写一点,去boss直聘上看别人写的岗位要求,可以把你会的整合一下,比如熟悉常规的开关电源拓扑结构(BUCK、正激、反激、LLC等),熟悉常用的通信总线协议和通信接口,如UART,IIC,SPI等。简历首先是HR看的,HR大多不懂技术,会从简历里去找关键字,你没有那些关键字他可能就把你筛掉了,所以个人技能尽量针对着岗位描述写一下。还有电赛获佳绩,获奖了就写什么奖,没获奖就把获佳绩删了吧,要不会让人感觉夸大。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务