24.两两交换链表中的节点
题目链接:24.两两交换链表中的节点
解法:定义虚拟头节点
思路:设置临时节点,将cur节点下一位节点指向2节点,2节点下一位节点指向1节点,cur节点移动两位实现下一轮交换。
class Solution {
public ListNode swapPairs(ListNode head) {
ListNode pre = new ListNode();
pre.next = head;
ListNode cur = pre;
while(cur.next != null && cur.next.next != null) {
ListNode next3 = cur.next.next.next;
ListNode next2 = cur.next.next;
ListNode next1 = cur.next;
cur.next = next2;
next2.next = next1;
next1.next = next3;
cur = cur.next.next;
}
return pre.next;
}
}
19.删除链表的倒数第N个节点
题目链接:19.删除链表的倒数第N个节点
解法:定义虚拟头节点+快慢指针法
思路:调用for循环使快指针移动n步后,快指针和慢指针同时移动,当快指针下一位指向null时,循环结束,通过slow.next = slow.next.next删除该节点,返回头结点。
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode dummyhead = new ListNode(0);
dummyhead.next = head;
ListNode fast = dummyhead;
ListNode slow = dummyhead;
for(int i = 0;i<n;i++){
fast = fast.next;
}
while(fast.next!=null){
fast = fast.next;
slow = slow.next;
}
slow.next = slow.next.next;
return dummyhead.next;
}
}
面试题.链表相交
题目链接:链表相交
解法:快慢指针法
思路:长短链表分别定义快慢指针。长短链表指针同时走,第一轮中短链表中的指针走完后去走长链表的指针,如果有交点,快慢指针会在第二轮相遇。
public class Solution {
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
ListNode fastA = headA;
ListNode slowA = headA;
ListNode fastB = headB;
ListNode slowB = headB;
while(fastA!=null||fastB!=null){
if(fastA==null){
slowB = slowB.next;
fastB = fastB.next;
}
else if(fastB == null){
fastA = fastA.next;
slowA = slowA.next;
}
else{
fastA = fastA.next;
fastB = fastB.next;
}
}
while(slowA!=null&&slowB!=null){
if(slowA == slowB){
return slowA;
}
else{
slowA = slowA.next;
slowB = slowB.next;
}
}
return null;
}
}
142.环形链表II
题目链接:142.环形链表II
解法:快慢指针法
思路:
1.判断链表是否有环:使用快慢指针法,分别定义 fast 和 slow 指针,从头结点出发,fast指针每次移动两个节点,slow指针每次移动一个节点,如果 fast==slow ,说明这个链表有环。
2.找到环的入口:从头结点出发一个指针,从相遇节点也出发一个指针,这两个指针每次只走一个节点, 那么当这两个指针相遇的时候就是环形入口的节点。
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 index1 = fast;
ListNode index2 = head;
while (index1 != index2) {
index1 = index1.next;
index2 = index2.next;
}
return index1;
}
}
return null;
}
}