1. 24.两两交换链表中的节点
题目链接:
leetcode.cn/problems/sw…
思路分析:
本题就是典型的链表交换问题,只不过是分组交换。相比于迭代建议本题使用递归的方式进行解答。
如果链表中至少有两个节点,则在两两交换链表中的节点之后,原始链表的头节点变成新的链表的第二个节点,原始链表的第二个节点变成新的链表的头节点。链表中的其余节点的两两交换可以递归地实现。在对链表中的其余节点递归地两两交换之后,更新节点之间的指针关系,即可完成整个链表的两两交换。
2. 19.删除链表的倒数第N个结点
题目链接:
leetcode.cn/problems/re…
思路分析:
本题可以使用双指针的方法去解决。
首先老规矩,定义虚拟头节点。然后定义快慢指针都指向虚拟头节点,先用快指针遍历链表(次数为输入的n),然后用快慢指针同时遍历(此时的条件为快指针的next不指向nil),这样快指针比慢指针快一步,当快指针指向nil的时候,删除慢指针的next元素->这个元素为倒数第N个节点。
3. 面试题 02.07.链表相交
题目链接:
leetcode.cn/problems/in…
思路分析:
本题同样可以使用双指针去进行解决。
只有当链表headA和headB都不为空时,两个链表才可能相交。因此首先判断链表headA和headB是否为空,如果其中至少有一个链表为空,则两个链表一定不相交,返回null。
当链表headA和headB 都不为空时,创建两个指针pA和pB,初始时分别指向两个链表的头节点headA和headB,然后将两个指针依次遍历两个链表的每个节点。具体做法如下:
1.每步操作需要同时更新指针pA和pB。
2.如果指针pA不为空,则将指针pA移到下一个节点。如果指针pB不为空,则将指针pB移到下一个节点。
3.如果指针pA为空,则将指针pA移到链表headB的头节点;如果指针pB为空,则将指针pB移到链表headA的头节点。
4.当指针pA和pB指向同一个节点或者都为空时,返回它们指向的节点或者null。
4. 142.环形链表 ||
题目链接:
leetcode.cn/problems/li…
思路分析:
本题同样可以使用双指针去进行解决。
快指针一次走两步,慢指针一次走一步。当一次快慢指针相遇时,证明有环,快指针回到head,然后快指针和慢都走一步,当第二次相遇时,找到环的入口,否则返回nil。