代码随想录算法训练营第四天| 24. 两两交换链表中的节点、19.删除链表的倒数第N个节点、面试题 02.07. 链表相交、142.环形链表II
24. 两两交换链表中的节点
题目链接:24. 两两交换链表中的节点
思路
递归递归啦
解题代码
/**
1. Definition for singly-linked list.
2. type ListNode struct {
3. Val int
4. Next *ListNode
5. }
*/
func swapPairs(head *ListNode) *ListNode {
if head == nil || head.Next == nil {
return head
}
p := head.Next
head.Next = swapPairs(p.Next)
p.Next = head
return p
}
19.删除链表的倒数第N个节点
题目链接:19.删除链表的倒数第N个节点
思路
找到待删除节点的前一个节点即可
解题代码
/**
6. Definition for singly-linked list.
7. type ListNode struct {
8. Val int
9. Next *ListNode
10. }
*/
func removeNthFromEnd(head *ListNode, n int) *ListNode {
newHead := &ListNode{}
newHead.Next = head //虚拟头节点
cur := head //遍历指针
prev := newHead //用于存放删除节点的前一个节点
i := 1
for cur != nil {
cur = cur.Next
if i > n {
prev = prev.Next
}
i++
}
prev.Next = prev.Next.Next
return newHead.Next
}
面试题 02.07. 链表相交
题目链接:面试题 02.07. 链表相交
思路
两个指针一起遍历
解题代码
/**
11. Definition for singly-linked list.
12. type ListNode struct {
13. Val int
14. Next *ListNode
15. }
*/
func getIntersectionNode(headA, headB *ListNode) *ListNode {
l1,l2 := headA, headB //双指针
for l1 != l2 {
if l1 != nil {
l1 = l1.Next //l1向后
} else {
l1 = headB //l1结束,直接往l2上靠拢
}
if l2 != nil {
l2 = l2.Next //l2向后
} else {
l2 = headA //同理
}
}
return l1
}
142.环形链表II
题目链接:142.环形链表II
思路
- 设置快慢指针,快指针每次前进两步,慢支针每次前进一步,其本质为快指针通过环追赶慢指针,快指针先在链表里转圈,然后慢指针也进来转圈。
- 利用x=z,找环的入口
解题代码
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
func detectCycle(head *ListNode) *ListNode {
slow, fast := head, head
for fast != nil && fast.Next != nil {
slow = slow.Next //慢指针走一步
fast = fast.Next.Next //快指针走两步
if slow == fast {
for slow != head { //利用 x=z 找到环的起点
slow = slow.Next
head = head.Next
}
return head
}
}
return nil1
}
本文介绍了四种链表相关的算法问题的解题思路和代码实现:1)两两交换链表中的节点,使用递归方法;2)删除链表的倒数第N个节点,通过虚拟头节点辅助;3)链表相交,采用双指针同步遍历;4)环形链表II,利用快慢指针寻找环的入口。

被折叠的 条评论
为什么被折叠?



