圣诞节,但是得投暑期实习,被迫继续写链表题>_<
以循环第一次处理来分析,哨兵头节点指向2号,1号指向3号,2号指向1号。
在代码实现上就类似反转链表,需要用到3个指针
在这种指针很多的情况下,注意循环条件里面只放一个指针,在每次循环里面先设定指针,再进行操作。
最后用了哨兵节点记得返回dummy.next
class Solution {
public ListNode swapPairs(ListNode head) {
ListNode dummy = new ListNode(0,head);
ListNode p = dummy, p1, p2;
while(p.next != null && p.next.next != null) {
// 移动指针
p1 = p.next;
p2 = p.next.next;
// 哨兵头节点指向2号,1号指向3号,2号指向1号
p.next = p2;
p1.next = p2.next;
p2.next = p1;
// 移动指针
p = p1;
}
return dummy.next;
}
}
链表双指针,一般是快慢指针,快指针先走n步,然后快慢指针一起走,当快指针停下时慢指针就指向倒数第n个节点
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode dummy = new ListNode(0,head);
ListNode p1 = dummy, p2 = dummy;
for (int i = 0; i < n; i++) {
p1 = p1.next;
}
while (p1.next != null) {
p1 = p1.next;
p2 = p2.next;
}
p2.next = p2.next.next;
return dummy.next;
}
}
一开始很迷,后面发现题目给的信息够多了,没什么需要自己想的
public class Solution {
public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
int lengthA = 0, lengthB = 0;
ListNode tempA =headA, tempB = headB;
while(tempA!=null){
tempA = tempA.next;
lengthA++;
}
while(tempB!= null){
tempB = tempB.next;
lengthB++;
}
tempA = headA;
tempB = headB;
if(lengthA > lengthB){
for(int i =0; i< lengthA-lengthB;i++){
tempA = tempA.next;
}
}
else if(lengthB > lengthA){
for(int i =0; i< lengthB-lengthA;i++){
tempB = tempB.next;
}
}
while(tempA != tempB && tempA!=null &&tempB !=null){
tempA = tempA.next;
tempB = tempB.next;
}
return tempA;
}
}
链表里的快慢指针,如果有环的话快慢指针一定会相遇
但这道题难度主要在于找到入环的第一个结点,看网上给的推导才勉强懂,太逆天了推出位置等于快慢指针相遇后走到入环点的距离
public class Solution {
public ListNode detectCycle(ListNode head) {
if (head == null) return null;
ListNode p1 = head, p2 = head;
ListNode p3 = head, p4;
while(p2 != null && p2.next != null) {
p1 = p1.next;
p2 = p2.next.next;
if (p1 == p2) {
p4 = p1;
while (p3 != p4) {
p3 = p3.next;
p4 = p4.next;
}
return p3;
}
}
return null;
}
}
ok到这里链表的题也刷完了,冲冲冲