連結串列奇偶分離,並且連結串列反轉
阿新 • • 發佈:2019-01-11
題目:
將連結串列中的所有元素為奇數的節點移到元素為偶數節點的前面,並使奇數之間順序反轉,偶數之間順序反轉。
示例:
交換前連結串列的順序 交換後連結串列的順序
4→5→7→1→6 ==> 1→7→5→6→4
1 ==> 1 (連結串列僅含一個元素)
2→1 ==> 1→2
==> (連結串列為空)
思路:定義奇數偶數分別的連結串列,
原連結串列 2—>3—>4—>5—>6:
結果:5—>3—>6—>4—>2
奇數連結串列:3—>5
偶數連結串列:2—>4—>6
偶數+奇數:2—>4—>6—>3—>5
反轉連結串列5—>3—>6—>4—>2
package exam; /* * 連結串列保持順序奇數在前偶數在後,並且反轉連結串列 */ public class Demo { public static void main(String[] args) { Node n1 = new Node(2); Node n2 = new Node(3); Node n3 = new Node(4); Node n4 = new Node(5); Node n5 = new Node(6); n1.next = n2; n2.next = n3; n3.next = n4; n4.next = n5; Node n = getOddEvenNode(n1); System.out.println(n); } // 奇數偶數歸類 public static Node getOddEvenNode(Node node) { if (node == null || node.next == null) return node; Node oddHead = new Node(0); Node odd = new Node(0); oddHead.next = odd; Node evenHead = new Node(0); Node even = new Node(0); evenHead.next = even; int k = 0; while (node != null) { if (node.val % 2 == 0) { even.next = node; even = even.next; } else { odd.next = node; odd = odd.next; } k++; node = node.next; } even.next = oddHead.next.next; node = evenHead.next.next; return reverse(node, k); } // 反轉連結串列 ,統計個數,定義頭結點head,定義初始尾節點是node的第一個節點,後面的每個節點都插入到head和next中間,next不斷的變化 public static Node reverse(Node node, int k) { Node head = new Node(0); // 中間節點,儲存每次node下一個值, Node interNode = null; interNode = node.next; node.next = null; Node next = node; head.next = node; node = interNode; int inter = 1; while (node != null && inter != k) { interNode = node.next; node.next = null; head.next = node; node.next = next; next = node; node = interNode; inter++; } return head.next; } }