1、题目:328. 奇偶链表 - 力扣(LeetCode) (leetcode-cn.com)
2、实现
(1)思路:
- 将链表分为两个链表,即一个奇数链表,一个偶数链表;
- 定义五个指针:奇数链表的头指针、奇数链表的尾指针、偶数链表的头指针、偶数链表的尾指针、指向当前节点的指针(初始时指向第三个节点)
- 遍历数组,重复如下操作:
- 最后将得到的偶数链表利用尾插法插入到奇数链表的结尾,返回新链表即可。
(2)代码:
/**
* Definition for singly-linked list.
* function ListNode(val, next) {
* this.val = (val===undefined ? 0 : val)
* this.next = (next===undefined ? null : next)
* }
*/
/**
* @param {ListNode} head
* @return {ListNode}
*/
var oddEvenList = function(head) {
// 当为空链表或者链表中只有一个元素时,直接返回链表
if(head === null || head.next === null) {
return head;
}
// 定义4个链表指针,分别是:奇数链表头结点、奇数链表尾结点;偶数链表头结点、偶数链表尾结点
let oddHead = head, oddTail = oddHead;
let evenHead = head.next, evenTail = evenHead;
let curr = head.next.next;
while(curr !== null) {
oddTail.next = curr;
oddTail = curr;
curr = curr.next;
// 当下一个节点不为空时
if(curr !== null) {
evenTail.next = curr;
evenTail = curr;
curr = curr.next;
}
}
// 将偶数链表插到奇数链表的结尾
oddTail.next = evenHead;
// 偶数链表的尾结点指向null
evenTail.next = null;
return head;
};
3、参考:奇偶链表 | 图解链表 | 最清晰易懂的题解 【c++/java版】 - 奇偶链表 - 力扣(LeetCode) (leetcode-cn.com)