奇偶链表
Posted ping2yingshi
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了奇偶链表相关的知识,希望对你有一定的参考价值。
此博客链接:https://www.cnblogs.com/ping2yingshi/p/12762546.html
奇偶链表(40)
题目链接:https://leetcode-cn.com/problems/odd-even-linked-list/
给定一个单链表,把所有的奇数节点和偶数节点分别排在一起。请注意,这里的奇数节点和偶数节点指的是节点编号的奇偶性,而不是节点的值的奇偶性。
请尝试使用原地算法完成。你的算法的空间复杂度应为 O(1),时间复杂度应为 O(nodes),nodes 为节点总数。
示例 1:
输入: 1->2->3->4->5->NULL
输出: 1->3->5->2->4->NULL
示例 2:
输入: 2->1->3->5->6->4->7->NULL
输出: 2->3->6->7->1->5->4->NULL
题解:
思路:此题和上题反转链表思路类似。
1.创建一个存储奇数的头节点。
2.创建一个存储偶数的头结点。
3.遍历链表,先把奇数节点的next指向链表,再把偶数节点的next指向链表。
4.把偶数链表的头节点连接到奇数链表的尾部。
注意:遍历链表时的条件是链表不为空。但是第二次把链接中偶数标号链接到偶数链表中时,需要注意此时链表是否为空。
代码如下:
class Solution { public ListNode oddEvenList(ListNode head) { ListNode siplehead=new ListNode(0); ListNode doubhead=new ListNode(0); ListNode siple=siplehead; ListNode doub=doubhead; ListNode p=head; while(p!=null) { siple.next=p; p=p.next; siple=siple.next; if(p!=null) { doub.next=p; p=p.next; doub=doub.next; } } siple.next=doubhead.next; return siplehead.next; } }
但是程序显示错误
查找原因,发现原来是偶数链表最后一个节点没有置为null;
正确代码:
class Solution { public ListNode oddEvenList(ListNode head) { ListNode siplehead=new ListNode(0); ListNode doubhead=new ListNode(0); ListNode siple=siplehead; ListNode doub=doubhead; ListNode p=head; while(p!=null) { if(p!=null) { siple.next=p; p=p.next; siple=siple.next; } if(p!=null) { doub.next=p; p=p.next; doub=doub.next; } } siple.next=doubhead.next; doub.next=null;//上面代码没有加这句 return siplehead.next; } }
以上是关于奇偶链表的主要内容,如果未能解决你的问题,请参考以下文章