文章目录
Leetcode 24. 两两交换链表中的节点
题目链接
本题思路
这图画的太规整了
这是我画的
需要注意的点
- 设置虚拟头节点
ListNode dummNode =new ListNode(0);
dummyNode.next=head;
ListNode cur=dummyNode;
- cur指针一定要指向交换两指针的前一个节点
- 最前面的合理性判断需要考虑链表的长度为奇数还是偶数
奇数的话 两两交换会剩下一个 总不能和null 交换所以 所以
循环截止条件cur.next.next =null;
偶数的话 就不用在乎了 cur.next=null;
while(cur.next!=null && cur.next.next!=null)
// 这里前后是有区别的,如果后者放到
// 前面会出现空指针报错
- 两两交换逻辑
ListNode temp =cur.next;
ListNode temp1=cur.next.next.next;
//由cur->2节点
cur.next= cur.next.next;
//由2节点转向1节点
temp= cur.next;
//由1节点到3节点
temp1= temp.next;
//cur的后移考虑啊到每次都在交换节点之前
cur=cur.next.next
AC 代码
class Solution {
public ListNode swapPairs(ListNode head) {
ListNode dummy =new ListNode(0);
ListNode cur=dummy;
dummy.next=head;
while( cur.next!=null&& cur.next.next!=null)
{
ListNode temp= cur.next;
ListNode temp1= cur.next.next.next;
cur.next= cur.next.next; //步骤一
cur.next.next=temp; //步骤二
temp.next =temp1; //步骤三
cur=cur.next.next; // cur移动两位,准备下一轮交换
}
return dummy.next;
}
}
Leetcode 19.删除链表的倒数第N个节点
题目链接
需要注意的点
- FastIndex 先走n+1步 正好是链表中导数第n个位置,
SlowIndex 和FastIndex 同时出发直到fastindex到头,正好slowIndex在 删除数前一个
可以作为操作数
ListNode dummyNode= new ListNode(0);
dummyNode.next =head; //将虚拟头节点指向head
//生成快慢指针
ListNode fastIndex =dummyNode;
ListNode slowIndex =dummyNode;
//只要快慢指针相差n个节点即可
for(int i=0;i<n ;i++)
{
fastIndex =fastIndex.next; //
}
while(fastIndex.next!= null){
fastIndex =fastIndex.next;
slowIndex = slowIndex.next;
}
//此时slowIndex 的位置就是删除元素的前一个位置。
//具体情况课自己画一个链表长度为3的图来模拟代码来理解
slowIndex.next=slowIndex.next.next;
return dummyNode.NEXT;
今天跨年,还在敲代码 呜呜呜 下面是AC代码
AC代码
> public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode dummy = new ListNode(0);
dummy.next = head;
ListNode FastIndex=dummy;
ListNode SlowIndex=dummy;
for(int i=0;i<n+1;i++) //因为fastIndex
{
FastIndex=FastIndex.next;
}
while(FastIndex!=null)
{
FastIndex=FastIndex.next;
SlowIndex=SlowIndex.next;
}
SlowIndex.next =SlowIndex.next.next;
return dummy.next;
}
}
Leetcode面试题 02.07. 链表相交
题目链接
这个略了
Leetcode 142环形链表II
题目链接
难点:
- 如何判断有环 (通过双指针方式来判断)
while( fast!=null && fast.next!=null)
{
fast=fast.next.next; //
slow = slow.next;
}
if(fast==slow)
{
index1 = fast ;// slow也可以 这里是相遇得地方 一会附上我画得图
index2 =head ;
}
- 如何找到入口点
通过上面已经定义得 index1 和index2来找 不过为什么嘛 这里需要数学推导
从图中看到 X、Y、Z ;
慢指针slow的轨迹为 x+y, 快指针fast的轨迹为 x+y+n(y+z)
由于slow每次移动都是一步 ,fast 是两步 如下图推导
while(index1 != index2){
index1 =index1.next;
index2 =index2.next;
}
return indext2; // 出口 为Z
return null; //没有找到返回空指针
AC代码
public ListNode detectCycle(ListNode head) {
ListNode slow =head;
ListNode fast =head;
while(fast != null && fast.next!=null)
{
slow =slow.next;
fast=fast.next.next;
if( slow ==fast)
{
ListNode index1 = fast ;//交点
ListNode index2 = head; //头
while(index1!= index2)
{
index1=index1.next;
index2=index2.next;
}
return index1;
}
}
return null;
}
今日收获
今天听了一段 罗振宇的时间的朋友 他讲到 博尔赫斯的一段话