随想录训练营Day4|24. 两两交换链表中的节点,19.删除链表的倒数第N个节点,面试题 02.07. 链表相交
标签: LeetCode闯关记
##1.两两交换链表中的节点 ###1.1 题目 相关链接 24. 两两交换链表中的节点
###1.2 解题思路
###1.3 遇到问题 无 ###1.4 算法实现
class Solution {
public ListNode swapPairs(ListNode head) {
ListNode dummy = new ListNode(-1, head);
ListNode cur = dummy;
ListNode firstNode = null;
ListNode secondNode = null;
ListNode temp = null;
while(cur.next != null && cur.next.next != null){
//注意提前保存之后需要指向的元素;
firstNode = cur.next;
secondNode = cur.next.next;
temp = cur.next.next.next;
cur.next = secondNode;
secondNode.next = firstNode;
firstNode.next = temp;
cur = firstNode;
}
return dummy.next;
}
}
注意点:待更新
###1.5 题目总结 解题耗时:40min ###1.6 相关题目
##2.19.删除链表的倒数第N个节点 ###2.1 题目 题目:19.删除链表的倒数第N个节点 ###2.2 解题思路
###2.4 实现代码
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
//虚拟头结点
ListNode dummy = new ListNode(-1,head);
//to delete the node need to find the n+1 node(倒数)
ListNode x = findFromEnd(dummy,n + 1);//why这里是dummy不是head? 这个返回值不会有变化吗?
//解法中在链表头部接一个虚拟节点 dummy 是为了避免删除倒数第一个元素时出现空指针异常,在头部加入 dummy 节点并不影响尾部倒数第 k 个元素是什么。不懂这个解释....因为dummy的位置为-1? 但是调用findFromEnd 方法的时候,head为dummy啊?????→理解了,确实是这样,模拟两遍就好,加入dummy之后不会影响;
//记住:找倒数第n个结点,决定是否找的是正确元素的关键是,p1 和p1 是否相距n;只要p1走了n步之后,p2才出发,那么就是对的.
//删除倒数第n个结点
x.next = x.next.next;
return dummy.next;
}
//返回倒数第k个结点
ListNode findFromEnd(ListNode head, int k){
ListNode p1 = head;
//p1先走k步
for(int i = 0; i < k; i++ ){
p1 = p1.next;
}
//然后,p2开始走
ListNode p2 = head;
while(p1 != null){
p1 = p1.next;
p2 = p2.next;
}
//现在,p2 位置为第n-k+1, 即倒数第n个;
return p2;
}
}
注意点:
###2.5 题目总结 解题耗时: 40min ###2.6 相关题目
##3. 面试题 02.07. 链表相交 ###3.1 题目 相关链接 面试题 02.07. 链表相交
###3.2 解题思路 一些巧思 ###3.3 遇到问题 无 ###3.4 算法实现
public class Solution {
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
ListNode p1 = headA, p2 = headB;
while (p1 != p2) {
// p1 走一步,如果走到 A 链表末尾,转到 B 链表
if (p1 == null){p1 = headB;} //为什么不能是p1.next == null?(待问) 这样超过时间限制
else{p1 = p1.next;}
// p2 走一步,如果走到 B 链表末尾,转到 A 链表
if (p2 == null){p2 = headA;} //为什么不能是p2.next == null?(待问)
else{ p2 = p2.next;}
}
return p1;
}
}
注意点: 条件: p1 == null
###3.5 题目总结 解题耗时:30min ###3.6 相关题目
##4. 今日心得 在动车上要晕过去了, 3.17提前写掉了,明后天有点事,下周一总结复习.