涉及到 增删改操作,用虚拟头结点都会方便很多
24. 两两交换链表中的节点 17:13min
出现了如下问题,while循环的终止条件有误,应该保证后两个都不为空
使用的是模拟的方法,还可以使用递归
class Solution {
public ListNode swapPairs(ListNode head) {
if (head == null || head.next == null)
return head;
ListNode dummy = new ListNode(0);
dummy.next = head;
ListNode cur = dummy;
while (cur.next != null && cur.next.next != null) {
ListNode temp1 = cur.next;
ListNode temp2 = cur.next.next;
cur.next = temp2;
temp1.next = temp2.next;
temp2.next = temp1;
cur = cur.next.next;
}
return dummy.next;
}
}
19.删除链表的倒数第N个节点 19:22min
又出现了边界问题,原先方法采用了最笨的方法,即遍历得出size,在size-n再遍历。
可以使用快慢指针,只用让快指针和慢指针永远相差n个即可。
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode dummy = new ListNode(0, head);
ListNode fastNode=dummy;
ListNode slowNode=dummy;
for(int i=0;i<n;i++){
fastNode=fastNode.next;
}
while(fastNode.next!=null){
fastNode=fastNode.next;
slowNode=slowNode.next;
}
slowNode.next=slowNode.next.next;
return dummy.next;
}
}
面试题 02.07. 链表相交
面试题 02.07. 链表相交 - 力扣(LeetCode)
没有自己写出来。
思路如下,先或得两个的长度,让最大长度的为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) { // 求链表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;
}
}
142.环形链表II
没能自己写出来。
使用快慢指针,一个一次走两个,一个一次走一个,如果有环则会相遇。
相遇之后,再让一个指针指向头结点,一个指向相遇节点,同时每次向前走一个,相遇节点即环开始的节点。
推到过程如下:
public class Solution {
public ListNode detectCycle(ListNode head) {
ListNode slow = head;
ListNode fast = head;
while (fast != null && fast.next != null) {
slow = slow.next;
fast = fast.next.next;
if (slow == fast) {
ListNode temp1 = fast;
ListNode temp2 = head;
while (temp1 != temp2) {
temp1 = temp1.next;
temp2 = temp2.next;
}
return temp1;
}
}
return null;
}
}