反转链表有很多方法比如虚拟头节点头插法,或者用下面这个方法:也是leetcode
class Solution {
public ListNode swapPairs(ListNode head) {
ListNode dumphead = new ListNode(-1);
dumphead.next=head;
ListNode cur = dumphead;
ListNode temp1 = null;
ListNode temp2 =null;
while(cur.next!=null&&cur.next.next!=null){
temp1 = cur.next;
temp2 = cur.next.next.next;
cur.next = temp1.next;
temp1.next.next = temp1;
temp1.next = temp2;
cur = temp1;
}
return dumphead.next;
}
}
而删除链表倒数第N个节点:
可以理解为,删除链表翻转过来的第n个。但是还有更有的解法:有n这个信息就可以知道删除的节点在第N个位置,那么使用快慢指针定窗口的方式,让快指针指向链表尾后面null,慢指针指向删除节点位置的前一个,执行删除操作即可。
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode dummyNode = new ListNode(0);
dummyNode.next = head;
ListNode fastIndex = dummyNode;
ListNode slowIndex = dummyNode;
// 只要快慢指针相差 n 个结点即可
for (int i = 0; i <= n ; i++){
fastIndex = fastIndex.next;
}
while (fastIndex != null){
fastIndex = fastIndex.next;
slowIndex = slowIndex.next;
}
//此时 slowIndex 的位置就是待删除元素的前一个位置。
//具体情况可自己画一个链表长度为 3 的图来模拟代码来理解
slowIndex.next = slowIndex.next.next;
return dummyNode.next;
}
}