代码随想录算法训练营第四天 | LeetCode24 两两交换链表中的节点、LeetCode19 删除链表的倒数第N个节点、面试题 02.07. 链表相交 、142.环形链表II
)
在对链表中的元素进行删除操作时,操作指针应该指向要被删除的元素的前一个
LeetCode24 两两交换链表中的节点
题目链接
靠着元素之间的指针来遍历所有元素
public ListNode swapPairs(ListNode head) {
ListNode dummy = new ListNode(-1,head);
ListNode cur = dummy;
while(cur.next != null && cur.next.next != null){
ListNode temp = cur.next;
ListNode temp1 = cur.next.next.next;
cur.next = cur.next.next;
cur.next.next = temp;
temp.next= temp1;
cur = cur.next.next;
}
return dummy.next;
}
LeetCode 19.删除链表的倒数第N个节点
题目链接
第一种方法: 栈
思路: 先将所有元素,装入栈,再通过循环栈的弹出操作, 来找到被删除的节点的前一个, 再进行删除操作,需要用到虚拟节点
public ListNode removeNthFromEnd(ListNode head, int n) {
Stack<ListNode> myStack = new Stack<>();
ListNode dummy = new ListNode(-1, head);
ListNode cur = dummy;
while(cur != null){
myStack.push(cur);
cur = cur.next;
}
while(n-->=0){
cur = myStack.pop();
}
cur.next = cur.next.next;
return dummy.next;
}
第二种方法:双指针
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode dummy = new ListNode(-1, head);
ListNode slowCur = dummy;
ListNode fastCur = dummy;
while(n-- >=0 && fastCur != null){
fastCur = fastCur.next;
}
while(fastCur != null){
fastCur = fastCur.next;
slowCur = slowCur.next;
}
slowCur.next = slowCur.next.next;
return dummy.next;
}
面试题 02.07. 链表相交
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
if(headA == null || headB == null){
return null;
}
ListNode pA = headA;
ListNode pB = headB;
while(pA != pB){
pA = pA == null ? headB : pA.next;
pB = pB == null ? headA : pB.next;
}
return pB;
}
142.环形链表II
public ListNode detectCycle(ListNode head) {
ListNode slowCur = head;
ListNode fastCur = head;
// 寻找是否有环
while(fastCur != null && fastCur.next !=null){
fastCur = fastCur.next.next;
slowCur = slowCur.next;
if(slowCur == fastCur){
ListNode index1 = fastCur;
ListNode index2 = head;
while(index1 != index2) {
index1 = index1.next;
index2 = index2.next;
}
return index1;
}
}
return null;
}
今日总结:
要画图, 还要写详细的步骤, 否则我会抓狂的
没想到会用到数学
不要想当然
用心感受, 然后爱上它