注:今天有事明天补剩下的,并整合这周的算法题
24.两两交换链表中的节点
public ListNode SwapPairs(ListNode head)
{
var dummyHead = new ListNode(0,head);//设置虚拟头结点,并指向head头结点
ListNode cur = dummyHead;
while (cur.next != null && cur.next.next != null)
{
ListNode tmp1 = cur.next;
ListNode tmp2 = cur.next.next.next;
cur.next = cur.next.next;//节点一指向节点二
cur.next.next = tmp1;//节点三指向节点二
cur.next.next.next = tmp2;//节点二指向节点四,完成节点二、三的交换
cur = cur.next.next;//cur移位,准备下一轮
}
return dummyHead.next;
}
19.删除链表的倒数第 N 个结点
双指针应用,如果要删除倒数第n个节点,让fast移动n步,然后让fast和slow同时移动,直到fast指向链表末尾。这样fast和slow相差n,等fast指向末尾,删掉slow即可
public class Solution {
public ListNode RemoveNthFromEnd(ListNode head, int n) {
ListNode dummpHead = new ListNode(0);
dummpHead.next = head;
var fastNode = dummpHead;
var slowNode = dummpHead;
while(n-- != 0 && fastNode != null)
{
fastNode = fastNode.next;
}
while(fastNode.next != null)
{
fastNode = fastNode.next;
slowNode = slowNode.next;
}
slowNode.next = slowNode.next.next;
return dummpHead.next;
}
}