剑指offer T26 重排链表

题目:
在这里插入图片描述
思路:
这道题有点麻烦。
首先先找到这个链表的中点(快慢指针同时走,快指针走到尽头的时候,慢指针正好是链表的中点)
然后拆分成两个链表,把第二个链表反转
最后是在按要求把这两个链表接上

package 剑指offer;

public class t26重排链表 {

    //把链表拆分成两段
    public void reorderList(ListNode head) {
        //哨兵节点
        ListNode dummy = new ListNode(0);
        dummy.next = head;
        //快慢指针
        ListNode fast = dummy;
        ListNode slow = dummy;
        //遍历
        while (fast != null && fast.next != null) {
            slow = slow.next;
            fast = fast.next;
            if (fast.next != null) {
                fast = fast.next;
            }
        }
        //遍历到最后,fast值指向链表的最后一个节点
        //low指针指向链表的中间那个节点
        ListNode temp = slow.next;
        slow.next = null;
        //链接起来
        link(head, reverseList(temp), dummy);
    }
    //联系链表的操作
    private void link(ListNode node1, ListNode node2, ListNode head) {
        ListNode prev = head;
        while (node1 != null && node2 != null) {
            //先储存起node1的下一个节点
            //之所以需要先把node1的下一个节点储存,是因为node1接在node2后,无法再执行node1=node1.next
            ListNode temp = node1.next;


            prev.next = node1;
            node1.next = node2;
            prev = node2;

            node1 = temp;
            node2 = node2.next;
        }
        if (node1 != null) {
            prev.next = node1;
        }
    }

    private ListNode reverseList(ListNode first) {
        ListNode prev = null;
        ListNode cur = first;
        ListNode head = null;
        while (cur != null) {
            ListNode next = cur.next;
            cur.next = prev;
            if (next == null) {
                head = cur;
            }
            prev = cur;
            cur = next;
        }
        return head;
    }

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

你们卷的我睡不着QAQ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值