24. 两两交换链表中的节点
题目:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode swapPairs(ListNode head) {
ListNode dummyHead=new ListNode(-1);
dummyHead.next=head;
ListNode current=dummyHead;
ListNode temp=current.next;
while (current.next!=null&¤t.next.next!=null){
current.next=current.next.next;
temp.next=temp.next.next;
current.next.next=temp;
current=temp;
temp=current.next;
}
return dummyHead.next;
}
}
也可以把每一个节点都保存,这样逻辑更简单。
注意最后返回的是dummyHead.next而不是head,因为head已经改变位置了。
19.删除链表的倒数第N个节点
题目:
思路:
设置一个快指针,一个慢指针,先让快指针向后移动n个节点,再让两个指针共同移动,知道快指针为null,则慢指针指向的就是要删除的节点。
但需要知道删除节点的前一个节点,则让快指针多走n+1步,从而慢指针可以指向要删除节点的前一个节点。
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode dummyHead=new ListNode(-1);
dummyHead.next=head;
ListNode fast=dummyHead;
ListNode slow=dummyHead;
while (n+1>0){
fast=fast.next;
n--;
}
while (fast!=null){
fast=fast.next;
slow=slow.next;
}
slow.next=slow.next.next;
return dummyHead.next;
}
}
142.环形链表II
题目:
/**
* Definition for singly-linked list.
* class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution {
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=head;
ListNode index2=slow;
while (index1!=index2){
index1=index1.next;
index2=index2.next;
}
return index1;
}
}
return null;
}
}