class Solution {
public ListNode swapPairs(ListNode head) {
// 虚拟头节点
ListNode dummyHead = new ListNode();
dummyHead.next = head;
ListNode cur = dummyHead;
if(head == null){
return dummyHead.next;
}
while(cur.next != null && cur.next.next != null){
// 保持循环不变量,循环最重要的就是保持内部不变
// 保存三个指针
ListNode pre = cur.next;
ListNode after = cur.next.next;
ListNode temp = cur;
// 交换节点
pre.next = after.next; // 后指针下一位,给前指针下一位
after.next = pre; // 前指针给后指针下一位
temp.next = after; // 头部指针,指向交换后的后指针
// 后移两位。但是这里要注意,后移动两位,所以在while判断里面要注意移动一位和移动两位都要写不然就nullpiont
cur = cur.next.next;
}
return dummyHead.next;
}
}
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
int count = 0;
ListNode dummyCount = head;
while(dummyCount != null){ // 计数
count++;
dummyCount = dummyCount.next;
}
ListNode dummyHead = new ListNode();
dummyHead.next = head;
ListNode cur = dummyHead;
for(int i = 0; i < count - n; i++){
cur = cur.next;//到指定位置
}
cur.next = cur.next.next; // 删除节点
return dummyHead.next;
}
}
环问题要联想快慢指针,找到相交的之后在以相同速度移动,找到合适的第一个节点。具体可看代码随想录 。
public class Solution {
public ListNode detectCycle(ListNode head) {
// 快慢指针
ListNode slow = head;
ListNode fast = head;
while(fast != null && fast.next != null){ // 利用快指针判断是否为空,同时快指针判断两位,因为在循环内部需要快指针移动两位
slow = slow.next;
fast = fast.next.next;
if(slow == fast){ // 找到了 还需要进行位移 找到第一个位置
ListNode index1 = slow;
ListNode index2 = head;
while(index1 != index2){
index1 = index1.next;
index2 = index2.next;
}
return index1;
}
}
return null;
}
}