24 两两交换链表中的节点
题目链接:力扣题目链接
主要思想:使用一个虚拟头结点,头结点指向head。循环判断下一个和下下一个是否为空,因为如果不为空要进行交换。记录temp 1 2,是为了交换,记录 temp3是为了让1后指向3。
public static ListNode SwapPairs(ListNode head)
{
var dummyNode = new ListNode(0);
dummyNode.next = head;
var curNode= dummyNode;
while (curNode.next!=null&&curNode.next.next!=null)
{
var temp1 = curNode.next;
var temp2 = curNode.next.next;
var temp3=curNode.next.next.next;
curNode.next= temp2;
curNode.next.next = temp1;
curNode.next.next.next = temp3;
curNode = curNode.next.next;
}
return dummyNode.next;
}
19.删除链表的倒数第N个节点
题目链接:. - 力扣(LeetCode)
主要思想:双指针,fast指针要距离slow指针n个距离。
官方示例 :输入:head = [1,2,3,4,5],在循环内 三个值为
n(val) | 2 | 1 | 0 | -1 | -2 |
fast(val) | 0 | 1 | 2 | 3 | 4 |
slow(val) | 0 | 0 | 0 | 1 | 2 |
最后值为 -2 5 3,将slow的next值指向next.next值删除
public static ListNode RemoveNthFromEnd(ListNode head, int n)
{
var dummyNode= new ListNode(0);
dummyNode.next= head;
var slowNode = dummyNode;
var fastNode = dummyNode;
while (fastNode.next != null)
{
Console.Write($"n:{n} fast:{fastNode.val} slow{slowNode.val}\n");
if (n<=0)
{
slowNode=slowNode.next;
}
fastNode = fastNode.next;
n--;
}
slowNode.next = slowNode.next.next;
return dummyNode.next;
}
链表相交
题目链接:. - 力扣(LeetCode)
主要思想:先算出两个链表的长度差值,长的后移动差值位,然后比较
public ListNode GetIntersectionNode(ListNode headA, ListNode headB)
{
if(headA==null||headB==null) return null;
var dummyNodeA = headA;
var dummyNodeB = headB;
int lenA = 0;
int LenB = 0;
while (dummyNodeA.next!=null)
{
dummyNodeA = dummyNodeA.next;
lenA++;
}
while (dummyNodeB.next != null)
{
dummyNodeB = dummyNodeB.next;
LenB++;
}
dummyNodeA = lenA > LenB ? headA : headB;
dummyNodeB = lenA <= LenB ? headA : headB;
int gap = Math.Abs(lenA - LenB);
while (gap>0)
{
dummyNodeA=dummyNodeA.next;
gap--;
}
while (dummyNodeA!=null)
{
if (dummyNodeA==dummyNodeB)
{
return dummyNodeA;
}
dummyNodeA = dummyNodeA.next;
dummyNodeB=dummyNodeB.next;
}
return null;
}