24. 两两交换链表中的节点
注意使用虚拟头结点
class Solution {
public ListNode swapPairs(ListNode head) {
ListNode dummy = new ListNode(-1, head);
ListNode cur = dummy;
while (cur.next != null && cur.next.next != null) {
ListNode tmp = cur.next.next;
cur.next.next = tmp.next;
tmp.next = cur.next;
cur.next = tmp;
cur = tmp.next;
}
return dummy.next;
}
}
19.删除链表的倒数第N个节点
双指针
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode dummy = new ListNode(-1, head);
ListNode slow = dummy, fast = dummy;
while (n-- > 0) {
fast = fast.next;
}
while (fast.next != null) {
slow = slow.next;
fast = fast.next;
}
slow.next = slow.next.next;
return dummy.next;
}
}
206.面试题 02.07. 链表相交
比较两条链表的长度,将较长的改为A链表,方便后续操作,比较巧妙
public class Solution {
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
ListNode curA = headA;
ListNode curB = headB;
int lenA = 0, lenB = 0;
while (curA != null) {
lenA++;
curA = curA.next;
}
while (curB != null) {
lenB++;
curB = curB.next;
}
curA = headA;
curB = headB;
if (lenA < lenB) {
int tmpL = lenA;
lenA = lenB;
lenB = tmpL;
ListNode tmpN = curA;
curA = curB;
curB = tmpN;
}
int gap = lenA - lenB;
while (gap-- > 0) {
curA = curA.next;
}
while (curA != null) {
if (curA == curB)
return curA;
curA = curA.next;
curB = curB.next;
}
return null;
}
}
142.环形链表II
双指针,数学证明需要理解
public class Solution {
public ListNode detectCycle(ListNode head) {
ListNode slow = head;
ListNode fast = head;
while (fast != null && fast.next != null) {
fast = fast.next.next;
slow = slow.next;
if (fast == slow) {
ListNode cur = head;
while (cur != slow) {
slow = slow.next;
cur = cur.next;
}
return cur;
}
}
return null;
}
}