代码随想录 Day04
24. 两两交换链表中的节点
给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
class Solution {
public ListNode swapPairs(ListNode head) {
//虚拟头结点的方式来进行操作
ListNode dummy=new ListNode(0,head);
ListNode cur= dummy;
while(cur.next!=null&&cur.next.next!=null){// 注意一定是cur.next在左边 以防止出现空指针异常
ListNode temp1=cur.next;
ListNode temp2=temp1.next.next; //初次出现的变量注意进行类型定义
cur.next=cur.next.next;
cur.next.next=temp1;
temp1.next=temp2;
cur=cur.next.next;
}
return dummy.next;
}
}
19.删除链表的倒数第N个节点
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
//这个题目的关键就在于怎么找到倒数第n个节点 但是要操作的是倒数第n+1个节点
ListNode dummy=new ListNode(0,head);
ListNode fastNode=dummy;
ListNode slowNode=dummy;//最终使slowNode指向倒数第n+1个节点
while(n!=0){
n--;
fastNode=fastNode.next;
}
while(fastNode.next!=null){
//找到循环的终止点 体会fastNode!=null和fastNode.next!=null最终的fastNode值的不同
//当找到了终止点 从后往前找倒数第n个就容易了
fastNode=fastNode.next;
slowNode=slowNode.next;
}
slowNode.next=slowNode.next.next;
return dummy.next;
}
}
02.07. 链表相交
public class Solution {
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
ListNode curA=headA;
ListNode curB=headB;
int lengthA=0;
int LengthB=0;
while(curA!=null){//这种遍历不容易出现空指针异常 如果是curA.next容易出现空指针异常 而且计数会少记一回 到最后一个链表元素不会进入循环
lengthA++;
curA=curA.next;
}
//System.out.println("a的长度是"+lengthA);
while(curB!=null){
LengthB++;
curB=curB.next;
}
curA=headA;//遍历之后要重新赋值
curB=headB;
//想办法把长的链给A 两个链交换的时候,长度、表头都要交换
if(lengthA<LengthB){
int temp;
temp=lengthA;
lengthA=LengthB;
LengthB=temp;
ListNode tempNode=curA;
curA=curB;
curB=tempNode;//经过这个操作已经把长链变成A了
}
int gap=lengthA-LengthB;
while(gap!=0){
curA=curA.next;
gap--;
}
while(curA!=null){//改成 curA.next则会出现空指针异常 也会少比较最后一个链表的元素
if(curA==curB){//注意要找的不是值相同 而是结点相同
return curA;
}
curA=curA.next;
curB=curB.next;
}
return null;
}
}
142.环形链表II
public class Solution {
public ListNode detectCycle(ListNode head) {
//使用快慢指针法
ListNode slowPoint=head;
ListNode fastPoint=head;
while(fastPoint!=null&&fastPoint.next!=null){
fastPoint=fastPoint.next.next;
slowPoint=slowPoint.next;
if(fastPoint==slowPoint){
ListNode curNode1=fastPoint;
ListNode curNode2=head;
while(curNode1!=curNode2){
curNode1=curNode1.next;
curNode2=curNode2.next;
}
return curNode1;
}
}
return null;
}
}