24. 两两交换链表中的节点 (有点难度的)
我的代码:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode swapPairs(ListNode head) {
ListNode temp01 = null;
ListNode temp02 = null;
ListNode dummy = new ListNode(-1, head);
ListNode cur = head;
ListNode pre = dummy;
// 注意 while内条件
while (cur != null && cur.next != null) {
temp01 = pre.next;
pre.next = cur.next;
temp02 = cur.next.next;
cur.next.next = cur;
cur.next = temp02;
// 指针后移准备下一轮循环 只需要对pre和cur移动就可以了
pre = pre.next.next;
cur = pre.next;
}
return dummy.next;
}
}
-
题目最好画图理清楚结点之间的关系
左边是结点之间前后关系,右边是对应操作的代码。
① 其中,pre.next 和 cur.next.next 的值会被覆盖,要提前存储到临时变量 temp01和temp02里。
② 指针后移准备下一轮循环 只需要对pre和cur移动就可以了 -
while循环:cur != null && cur.next != null
这个容易出错,这段代码意思:A结点和B结点都存在时
19.删除链表的倒数第N个节点 (很简单)
我的代码: (双指针,first = low + n)
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode dummy = new ListNode(-1, head);
ListNode low = dummy, first = dummy;
// 让 first 后移 n 次
while (n != 0) {
first = first.next;
n--;
}
// 当fisrt指向最后一个结点的时候
while (first.next != null) {
first = first.next;
low = low.next;
}
// 删除操作
low.next = low.next.next;
return dummy.next;
}
}
- 流程如图所示:
删除的目标节点是 C
让 first = low + n ,即 first = low + 4
当 first 最后一个结点的时候,low是目标节点的前一个
面试题 02.07. 链表相交 ⭐(不会做)
答案代码:
public class Solution {
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
ListNode curA = headA;
ListNode curB = headB;
int lenA = 0, lenB = 0;
while (curA != null) { // 求链表A的长度
lenA++;
curA = curA.next;
}
while (curB != null) { // 求链表B的长度
lenB++;
curB = curB.next;
}
curA = headA;
curB = headB;
// 让curA为最长链表的头,lenA为其长度
if (lenB > lenA) {
//1. swap (lenA, lenB);
int tmpLen = lenA;
lenA = lenB;
lenB = tmpLen;
//2. swap (curA, curB);
ListNode tmpNode = curA;
curA = curB;
curB = tmpNode;
}
// 求长度差
int gap = lenA - lenB;
// 让curA和curB在同一起点上(末尾位置对齐)
while (gap-- > 0) {
curA = curA.next;
}
// 遍历curA 和 curB,遇到相同则直接返回
while (curA != null) {
if (curA == curB) {
return curA;
}
curA = curA.next;
curB = curB.next;
}
return null;
}
}