返回

精解【剑指Offer-Swift】22.链表中倒数第k个节点 & 24.反转链表

IOS

前言

【剑指Offer】是程序员面试中经常遇到的一个题库,它包含了大量经典的算法和数据结构问题。本文将详细讲解【剑指Offer-Swift】中的22.链表中倒数第k个节点和24.反转链表这两个问题。这两个问题相对简单,因此放在了一起讲解。

22.链表中倒数第k个节点

题目

给定一个链表,找到链表中倒数第k个节点。

解题思路

我们可以使用两个指针来解决这个问题。第一个指针从头开始移动,第二个指针从倒数第k个节点开始移动。当第一个指针到达链表末尾时,第二个指针正好指向倒数第k个节点。

代码实现

class ListNode {
    var val: Int
    var next: ListNode?
    init(_ val: Int) {
        self.val = val
        self.next = nil
    }
}

func findKthToLast(_ head: ListNode?, _ k: Int) -> ListNode? {
    guard let head = head, k > 0 else {
        return nil
    }

    var first = head
    var second = head

    for _ in 0..<k-1 {
        guard let next = first.next else {
            return nil
        }
        first = next
    }

    while first.next != nil {
        first = first.next!
        second = second.next!
    }

    return second
}

24.反转链表

题目

给定一个链表,反转链表并返回新链表的头节点。

解题思路

我们可以使用一个指针来反转链表。从头开始,依次将每个节点的next指针指向它的前一个节点,直到最后一个节点的next指针指向null。

代码实现

func reverseList(_ head: ListNode?) -> ListNode? {
    var prev: ListNode? = nil
    var curr: ListNode? = head

    while curr != nil {
        let next = curr?.next
        curr?.next = prev
        prev = curr
        curr = next
    }

    return prev
}

总结

本文详细讲解了【剑指Offer-Swift】中的22.链表中倒数第k个节点和24.反转链表这两个问题。这两个问题相对简单,因此放在了一起讲解。文章提供了清晰的思路和详细的代码,帮助读者快速理解和掌握这两个问题。