15.<tag-链表和结点的交换>-lt.328. 奇偶链表

lt.328. 奇偶链表

[案例需求]
在这里插入图片描述

[思路分析一, 简单直接的方法]

  • 题目要求我们把链表结点索引为偶数的单独连接在一起, 奇数的单独连接在一起, 然后奇数在前, 偶数在后整体连接到一起;
  • 最简单直接的方式就是新建两个虚节点, 索引为偶数的放在一起, 索引为奇数的放在一起, 然后再把这俩链表连接起来即可;

[代码实现]

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode oddEvenList(ListNode head) {
        //把head作为奇数结点. 设置一个结点始终指向这个奇数链表的尾结点 tail_1
        //2. 设置新head 作为偶数结点, 设置一个结点始终指向这个偶数链表的结点 tail_2
        //3. 遍历原链表, 遇到奇数节点, tail_1.next = 这个节点;
        //3. 遇到偶数结点, 去除原有关系, 直接 tail_2.next = 欧结点

        ListNode dummy1 = new ListNode(-1);
        ListNode temp1 = dummy1;

        ListNode dummy2 = new ListNode(-1);
        ListNode temp2 = dummy2;

        ListNode temp = head; //temp用来遍历原链表

        int index = 0;

        while(temp != null){
            ListNode cur_next = temp.next;
            if(index % 2 == 0){
                temp1.next = temp;
                temp.next = null;
                temp1 = temp1.next;
            }else{
                temp2.next = temp;
                temp.next = null;
                temp2 = temp2.next;
            }
            ++index;
            temp = cur_next;
        }

        temp1.next = dummy2.next;

        return dummy1.next;
    }
}

[思路分析二, 原地修改]
在这里插入图片描述

[代码实现]

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode oddEvenList(ListNode head) {

        if(head == null)return head;

        ListNode even = head; //偶数结点
        ListNode head_retain = head.next;
        ListNode odd = head_retain; //奇数结点
        while(odd != null && odd.next != null){
            even.next = odd.next;
            even = even.next; //even 向后移动

            odd.next = even.next;
            odd = odd.next; //odd 向后移动
        }

        even.next = head_retain;

        return head;
    }
}
posted @ 2022-05-26 20:29  青松城  阅读(31)  评论(0)    收藏  举报