1.以定值x为基准将链表分割(partition)成两部分,所有小于x的结点排在大于等于x结点之前。注意:分割后保持原链表数据顺序不变。
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
public class Partition {
public ListNode partition(ListNode pHead, int x) {
// < x
ListNode less = null;
ListNode lessLast = null;
// >= x
ListNode great = null;
ListNode greatLast = null;
ListNode cur = pHead;
while (cur != null) {
//前提是原链表不空
if (cur.val < x) {
if (less == null) { //less链表尾插
less = cur;
} else {
lessLast.next = cur;
}
lessLast = cur; //尾结点更新
} else {
if (great == null) { //great链表尾插
great = cur;
} else {
greatLast.next = cur;
}
greatLast = cur; //更新尾结点
}
cur = cur.next; //cur后移
}
if (less == null) { //判断less是不是为空
return great;
} else {
lessLast.next = great;
if (greatLast != null) {
greatLast.next = null; //最终返回链表尾结点.next=null
}
return less;
}
}
}
2.输入一个链表,输出该链表倒数第k个结点
class Solution {
private int getLength(ListNode head) {
int len = 0;
for (ListNode cur = head; cur != null; cur = cur.next) {
len++;
}
return len;
}
public ListNode middleNode(ListNode head) {
int len = getLength(head);
int midLen = len / 2;
ListNode node = head;
for (int i = 0; i < midLen; i++) {
node = node.next;
}
return node;
}
}
class Solution {
public ListNode middleNode(ListNode head) {
ListNode fast = head;
ListNode slow = head;
while (fast != null) {
fast = fast.next;
if (fast == null) {
break;
}
slow = slow.next;
fast = fast.next;
}
return slow;
}
}