一、翻转单链表
翻转
public ListNode1 reverse(ListNode1 head) {
// 特殊情况处理
if (head == null) {
return null;
}
ListNode1 pre = null;
ListNode1 cur = head;
while (cur != null) {
ListNode1 temp = cur.next;
cur.next = pre;
pre = cur;
cur = temp;
}
return pre;
}
二、判断链表中是否有环
是否有环
// 有环返回环内节点,无环则返回null
public ListNode hasCycle(ListNode head) {
if (head == null || head.next == null) {
return null;
}
ListNode slow = head.next;
ListNode fast = slow.next;
while (slow != null && fast != null) {
if (slow == fast) {
return slow;
}
slow = slow.next;
fast = fast.next;
if (fast != null) {
fast = fast.next;
}
}
return null;
}
三、链表中环的数量
查看代码
public int getCount(ListNode head) {
ListNode res = hasCycle(head);
if (res == null)
return 0;
int count = 1;
for (ListNode n = res; n.next != res; n = n.next) {
count++;
}
return count;
}
四、环的入口节点
查看代码
public ListNode getFirstNode(ListNode head) {
ListNode res = hasCycle(head);
if (res == null)
return null;
ListNode slow = head;
ListNode fast = head;
int count = getCount(head);
for (int i = 0; i < count; i++) {
fast = fast.next;
}
while (fast != slow) {
slow = slow.next;
fast = fast.next;
}
return slow;
}
五、链表中倒数第K个节点
查看代码
class Solution {
public ListNode getKthFromEnd(ListNode head, int k) {
if (head == null) return null;
ListNode fast = head;
ListNode slow = head;
for (int i = k; i > 0; i--) {
fast = fast.next;
}
while (fast != null) {
fast = fast.next;
slow = slow.next;
}
return slow;
}
}