提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 前言
- [一、力扣24. 两两交换链表中的节点](#一、力扣24. 两两交换链表中的节点)
- [二、力扣19. 删除链表的倒数第 N 个结点](#二、力扣19. 删除链表的倒数第 N 个结点)
- [三、力扣面试题 02.07. 链表相交](#三、力扣面试题 02.07. 链表相交)
- [四、力扣142. 环形链表 II](#四、力扣142. 环形链表 II)
前言
一、力扣24. 两两交换链表中的节点
迭代
java
/**
* 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 node = new ListNode(-1, head);
ListNode prev = node, cur = head;
int temp;
while(cur != null && cur.next != null){
temp = cur.val;
cur.val = cur.next.val;
cur.next.val = temp;
prev = cur.next;
cur = prev.next;
}
return node.next;
}
}
递归
java
/**
* 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) {
if(head == null || head.next == null){
return head;
}
int temp;
ListNode cur = head;
temp = cur.val;
cur.val = cur.next.val;
cur.next.val = temp;
ListNode node = swapPairs(cur.next.next);
if(node == null){
return cur;
}
return cur;
}
}
二、力扣19. 删除链表的倒数第 N 个结点
直观法
java
/**
* 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 removeNthFromEnd(ListNode head, int n) {
if(head == null){
return head;
}
ListNode node = new ListNode(-1, head);
ListNode pre = node, p = head;
int i = 0, size = 0;
while(p != null){
size ++;
p = p.next;
}
if(n > size){
return head;
}
p = head;
while(i < size-n){
i ++;
pre = p;
p = p.next;
}
pre.next = p.next;
return node.next;
}
}
双指针法
java
/**
* 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 removeNthFromEnd(ListNode head, int n) {
ListNode node = new ListNode(-1, head);
ListNode fast = node, slow = node;
int i = 1;
while(i <= n+1 && fast != null){
i ++;
fast = fast.next;
}
if(fast == null && i < n+1){
return node.next;
}
while(fast != null){
fast = fast.next;
slow = slow.next;
}
slow.next = slow.next.next;
return node.next;
}
}
三、力扣面试题 02.07. 链表相交
java
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution {
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
ListNode longL = new ListNode(-1, headA);
ListNode shortL = new ListNode(-1, headB);
ListNode pa = headA, pb = headB;
int lenA = 0, lenB = 0, diff = 0;
while(pa != null){
lenA ++;
pa = pa.next;
}
while(pb != null){
lenB ++;
pb = pb.next;
}
if(lenA > lenB){
diff = lenA - lenB;
longL.next = headA;
shortL.next = headB;
}else{
diff = lenB - lenA;
longL.next = headB;
shortL.next = headA;
}
pa = longL.next; pb = shortL.next;
for(int i = 0; i < diff; i++){
pa = pa.next;
}
while(pa != null && pb != null){
if(pa == pb){
return pa;
}
pa = pa.next;
pb = pb.next;
}
return null;
}
}
四、力扣142. 环形链表 II
因为快指针的速度是慢指针的两倍, 所以,在进入环形之后, 在快慢指针相遇之前, 慢指针必然走不满一圈,设入环之前的节点数为x, 入环后到相遇节点之前为y个, 相遇节点到入环处为z个, 相遇时, 快指针走过的节点数是慢指针的2倍, 故有,2(x + y) = x + n(z + y) + y,, 化简后为, x = n(z +y)-y, 右边提取一个 y 得到,x = (n-1)(z+y) + z, 此时的慢指针,一定会先走完z, 然后就是n-1圈, 就一直在进入点等待x
java
/**
* Definition for singly-linked list.
* class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution {
public ListNode detectCycle(ListNode head) {
ListNode fastNode = head, slowNode = head;
while(fastNode != null && fastNode.next != null){
fastNode = fastNode.next.next;
slowNode = slowNode.next;
if(fastNode == slowNode){
ListNode index1 = head;
ListNode index2 = slowNode;
while(index1 != index2){
index1 = index1.next;
index2 = index2.next;
}
return index1;
}
}
return null;
}
}