- 编写代码,以给定值x为基准将链表分割成两部分,所有小于x的结点排在大于或等于x的结点之前
public Node partX(int x) {
Node cur = this.head;
Node bs = null;
Node be = null;
Node as = null;
Node ae = null;
while (cur != null) {
if (cur.value < x) {
if (bs == null) { //第一次插入
bs = cur;
be = cur;
}//第二次插入
else {
be.next = cur;
be = cur;
}
if (as == null) { //第一次插入
as = cur;
ae = cur;
} else {
ae.next = cur;
ae = cur;
}
}
cur = cur.next;
}
//第一个区间没有数据
if (bs == null){
return as;
}
be.next = as;
if (as != null) { //让后一个区间的最后一个结点的next为null,否则容易出现死循环
ae.next = null;
}
return bs;
}
结果
2.
给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null
public Node detectCycle() {
Node fast = this.head;
Node slow = this.head;
while (fast != null && fast.next != null) { //判断是否有环
fast = fast.next.next;
slow = slow.next;
if (slow == fast) {
break;
}
}
if (fast == null || fast.next == null) {
return null;
}
//查找入环的第一个节点
slow = this.head;
while (fast != slow) {
slow = slow.next;
fast = fast.next;
}
return slow;
}