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 dummyNode = new ListNode();
dummyNode.next = head;
ListNode cur = dummyNode;
ListNode firstNode, sencondNode, thirdNode;
while(cur.next != null && cur.next.next != null) {
firstNode = cur.next;
sencondNode = firstNode.next;
thirdNode = sencondNode.next;
cur.next = sencondNode;
sencondNode.next = firstNode;
firstNode.next = thirdNode;
cur = firstNode;
}
return dummyNode.next;
}
}
// 递归法
class Solution {
public ListNode swapPairs(ListNode head) {
// 没有链表或者链表只有一个直接返回
if (head == null || head.next == null) {
return head;
}
ListNode next = head.next;
// 留下前两个进行交换
ListNode newHead = swapPairs(next.next);
head.next.next = head;
head.next = newHead;
return next;
}
}
19、删除链表的倒数第n个数
/**
* 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 dummyNode = new ListNode(-1, head);
ListNode fast = dummyNode;
ListNode slow = dummyNode;
for(int i = 0; i <= n; i++) {
fast = fast.next;
}
while(fast != null) {
fast = fast.next;
slow = slow.next;
}
if (slow.next != null) {
slow.next = slow.next.next;
}
return dummyNode.next;
}
}