题目:逐对的逆置链表;假设初始链表为1->2->3->4->X,逐对逆置后2->1->4->3->X
思路:使用递归、迭代分别实现
public static ListNode reversePairRecursive(ListNode headNode) {
ListNode tempNode = null;
if (headNode == null || headNode.getNext() == null) {
return headNode;
} else {
tempNode = headNode.getNext();
headNode.setNext(tempNode.getNext());
tempNode.setNext(headNode);
headNode = tempNode;
headNode.getNext().setNext(reversePairRecursive(headNode.getNext().getNext()));
return headNode;
}
}
public static ListNode reversePairIterative(ListNode headNode) {
ListNode tempNode = null;
ListNode newHeadNode = null;
while (headNode != null && headNode.getNext() != null) {
if (tempNode != null) {
tempNode.getNext().setNext(headNode.getNext());
}
tempNode = headNode.getNext();
headNode.setNext(headNode.getNext().getNext());
tempNode.setNext(headNode);
if (newHeadNode == null) {
newHeadNode = tempNode;
}
headNode = headNode.getNext();
}
return newHeadNode;
}
题目:把一个循环链表分割成两个长度相等的循环链表;如果链表的结点数为奇数,那么让第一个链表的结点数比第二个多一个。
思路:使用两个指针slowPtr和fastPtr从headNode同时移动,slowPtr一次移动一个结点,fastPtr一次移动两个结点;
如果循环链表的结点数为奇数,则fastPtr.getNext()将指向headNode
如果循环链表的结点数为偶数,则fastPtr.getNext().getNext()将指向headNode
public static ListNode splitList(ListNode headNode) {
ListNode slowPtr = headNode;
ListNode fastPtr = headNode;
if (headNode == null) {
return headNode;
}
while (fastPtr.getNext() != headNode && fastPtr.getNext().getNext() != headNode) {
fastPtr = fastPtr.getNext().getNext();
slowPtr = slowPtr.getNext();
}
if (fastPtr.getNext().getNext() == headNode) {
fastPtr = fastPtr.getNext();
}
ListNode headNode2 = slowPtr.getNext();
fastPtr.setNext(slowPtr.getNext());
slowPtr.setNext(headNode);
return headNode2;
}
题目:约瑟夫环,N个人想选出一个领头人,他们排成一个环,沿着环每数到第M个人就从环中排除该人,并从下一个人开始重新数。请找到最后留下的那个人
public static ListNode getJosephusPosition(ListNode headNode, int length, int m) {
for (int i = length; i > 1; i--) {
for (int j = 1; j < m - 1; j++) {
headNode = headNode.getNext();
}
headNode.setNext(headNode.getNext().getNext());
headNode = headNode.getNext();
}
return headNode;
}