【数据结构系列】链表合并问题——链表的奇偶重排
题目描述
给定一个单链表,请设定一个函数,将链表的奇数位节点和偶数位节点分别放在一起,重排后输出。
注意是节点的编号而非节点的数值。
示例1
输入
{1,2,3,4,5,6}
返回值
{1,3,5,2,4,6}
说明
1->2->3->4->5->6->NULL
重排后为
1->3->5->2->4->6->NULL
示例2
输入
{1,4,6,3,7}
返回值
{1,6,7,4,3}
说明
1->4->6->3->7->NULL
重排后为
1->6->7->4->3->NULL
奇数节点有1,6,7,偶数节点有4,3。重排后为1,6,7,4,3
解题思路
维护两个指针,一个指向奇数链表的头,一个指向偶数链表的头
先将链表分为奇数链表和偶数链表,然后再进行合并。
奇数位置的后面必定是偶数,偶数位置后面必定是奇数,利用这个特点即可解决这道题目~
public class 链表的奇偶重排 {
public class ListNode {
int val;
ListNode next = null;
}
public ListNode oddEvenList (ListNode head) {
if (head == null || head.next == null)
return head;
/*
odd 指向奇数节点的指针
oddHead 指向初始奇数节点的头指针
even 指向偶数节点的指针
evenHead 指向初始偶数节点的头指针
*/
ListNode odd = head,oddHead = head,even = head.next,evenHead = head.next;
while (even != null && even.next != null){
//奇数节点指向偶数节点的next
odd.next = even.next;
//奇数节点指针后移
odd = odd.next;
//偶数节点指向奇数节点的next
even.next = odd.next;
//偶数节点后移
even = even.next;
}
//将奇数节点的next指向偶数节点的初始头指针
odd.next = evenHead;
//返回奇数节点的初始头指针
return oddHead;
}
}