24. 两两交换链表中的节点
public ListNode swapPairs(ListNode head) {
if(head==null) return null;
ListNode dummy = new ListNode();
dummy.next = 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;
}
19.删除链表的倒数第N个节点
public ListNode removeNthFromEnd(ListNode head, int n) {
if(head==null) return null;
ListNode dummy = new ListNode();
dummy.next = head;
ListNode fast = dummy;
ListNode slow = dummy;
while(n!=0){
fast=fast.next;
n--;
}
while(fast.next!=null){
fast = fast.next;
slow = slow.next;
}
slow.next = slow.next.next;
return dummy.next;
}
本题总结:用双指针记录下标位置,fast移动,slow定位。
160.链表相交
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
if(headA==null || headB==null) return null;
ListNode curA = headA;
ListNode curB = headB;
int countA = 0;
int countB = 0;
while(curA!=null){
countA++;
curA = curA.next;
}
while(curB!=null){
countB++;
curB = curB.next;
}
int sub=0;
if(countA>=countB){
sub = countA-countB;
}else{
ListNode temp = headA;
headA = headB;
headB = temp;
sub = countB-countA;
}
curA = headA;
curB = headB;
while(sub!=0){
headA = headA.next;
sub--;
}
while(headA!=null){
if(headA==headB) return headA;
headA = headA.next;
headB = headB.next;
}
return null;
}
142.环形链表II
public ListNode detectCycle(ListNode head) {
ListNode fast = head;
ListNode slow = 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;
}