题目描述:设 c = {a1,b1,a2,b2,a3,b3,.......an,bn}位线性表,采用带头结点的hc表存放,设计一个算法,将其拆分为两个线性表,使得奇数位保持正序,偶数位转化为逆序。即: A = {a1, a2, ... an}, B = {bn, ... b2, b1}
解题思路:奇数位用尾插法,偶数位用头插法。
package xiaozhao;
public class ListSplit {
public static class ListNode {
private int data;
private ListNode next;
public ListNode(int data, ListNode next) {
this.data = data;
this.next = next;
}
}
public static ListNode create() {
ListNode[] list = new ListNode[6];
for (int i = 0; i < 6; i++) {
list[i] = new ListNode(i + 1, null);
}
for (int i = 0; i < 5; i++) {
list[i].next = list[i + 1];
}
ListNode hc = new ListNode(-1, null);
hc.next = list[0];
return hc;
}
public static void print(ListNode head) {
ListNode p = head.next;
while (p != null) {
System.out.print(p.data + " ");
p = p.next;
}
}
public static void listSplit(ListNode head) {
/*
* la 接收偶数位的元素的链表头;lb接收奇数位的元素的链表头
*/
ListNode la = new ListNode(-1, null);
ListNode lb = new ListNode(-1, null);
ListNode p = new ListNode(-1, null);
p = head.next;
int i = 0;
ListNode q = null;
ListNode ap = null;// 始终指向la的表尾元素
ap = la;
while (p != null) {
q = p.next;
if (i % 2 == 0) {
p.next = ap.next;
ap.next = p;
ap = p;
} else {
p.next = lb.next;
lb.next = p;
}
p = q;
i++;
}
print(la);
print(lb);
}
public static void main(String[] args) {
ListNode head = create();
print(head);
listSplit(head);
}
}