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;
}
}

浙公网安备 33010602011771号