24.两两交换链表中的节点
class Solution {
public ListNode swapPairs(ListNode head) {
ListNode dummyhead = new ListNode(0);
dummyhead.next = head;
ListNode cur = dummyhead;
ListNode temp = new ListNode();
ListNode temp1 = new ListNode();
while(cur.next!=null&&cur.next.next!=null){
temp = cur.next;
temp1 = cur.next.next.next;
cur.next = cur.next.next;
cur.next.next = temp;
temp.next = temp1;
cur = cur.next.next;
}
return dummyhead.next;
}
}
19.删除链表的倒数第N个节点
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode dummyhead = new ListNode(0);
dummyhead.next = head;
ListNode slow = dummyhead;
ListNode fast = dummyhead;
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 dummyhead.next;
}
}
面试题02.07. 链表相交
有时间可以再看看,重点思想是 两个链表尾端对齐。
/**
* 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 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 gap;
if(countA >= countB){
gap = countA - countB;
curA = headA;
curB = headB;
for(int i = 0; i < gap;i++){
curA = curA.next;
}
}else{
gap = countB - countA;
curA = headA;
curB = headB;
for(int i = 0; i < gap;i++){
curB = curB.next;
}
}
while(curA != null){
if(curA == curB){
return curA;
}
curA = curA.next;
curB = curB.next;
}
return null;
}
}
142.环形链表
public class Solution {
public ListNode detectCycle(ListNode head) {
ListNode fast = head;
ListNode slow = head;
while(fast != null&&fast.next!=null){
fast = fast.next.next;
slow = slow.next;
if(fast == slow){
ListNode index1 = fast;
ListNode index2 = head;
while(index1 != index2){
index1 = index1.next;
index2 = index2.next;
}
return index1;
}
}
return null;
}
}