24. 两两交换链表中的节点
/**
* 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 dumyhead = new ListNode(-1);
dumyhead.next = head;
ListNode cur = dumyhead;
ListNode temp;//临时节点
ListNode firstNode;
ListNode secondeNode;
while (cur.next!=null&&cur.next.next!=null){
temp = cur.next.next.next; //第三个节点
firstNode = cur.next;//第一个节点
secondeNode =cur.next.next;//第二个节点
cur.next = secondeNode;//第一个节点=第二个节点
secondeNode.next = firstNode;//第二个节点=第一个节点
firstNode.next = temp;//第三个节点=临时节点
cur = firstNode;//
}
return dumyhead.next;
}
}
19.删除链表的倒数第N个节点
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode dumyhead = new ListNode(0);
dumyhead.next = head;
ListNode fast = dumyhead;
ListNode slow = dumyhead;
for (int i = 0; i <=n; i++) {
fast = fast.next;
}
while (fast!=null){
fast = fast.next;
slow = slow.next;
}
slow.next = slow.next.next;
return dumyhead.next;
}
}
面试题 02.07. 链表相交
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
ListNode curA = headA;
ListNode curB = headB;
int lenA = 0, lenB = 0;
//求A B 的长度
while (curA!=null){
lenA++;
curA= curA.next;
}
while (curB!=null){
lenB++;
curB= curB.next;
}
curA = headA;
curB = headB;
if(lenB>lenA){
int tempLen = lenA;
lenA = lenB;
lenB= tempLen;
ListNode tempNode = curA;
curA = curB;
curB = tempNode;
}
int gap = lenA-lenB;
while (gap-->0){
curA=curA.next;
}
while (curA!=null){
if (curA==curB){
return curA;
}
curA=curA.next;
curB=curB.next;
}
return null;
}
142.环形链表II
public ListNode detectCycle(ListNode head) {
ListNode fast = head, slow = head;
while (true) {
if (fast == null || fast.next == null) return null;
fast = fast.next.next;
slow = slow.next;
if (fast == slow) break;
}
fast = head;
while (slow != fast) {
slow = slow.next;
fast = fast.next;
}
return fast;
}