前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Swift 反转链表 - LeetCode

Swift 反转链表 - LeetCode

作者头像
韦弦zhy
发布2018-12-19 17:13:00
1.2K0
发布2018-12-19 17:13:00
举报

LeetCode

题目: 反转链表

反转一个单链表。 示例:

代码语言:javascript
复制
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL

进阶: 你可以迭代或递归地反转链表。你能否用两种方法解决这道题?

方案一:
  • 迭代:在链表第一个和第二个元素断开链表,保存后半段,前半段拼在新head前方,然后赋值给新head:具体如下面示意
代码语言:javascript
复制
p: a -> b -> c -> d -> e -> nil
newHead = nil

temp = p.next        temp: b -> c -> d -> e -> nil
p.next = newHead        p: a -> nil
newHead = p       newHead: a -> nil
p = temp                p: b -> c -> d -> e -> nil

temp = p.next        temp: c -> d -> e -> nil
p.next = newHead        p: b -> a -> nil
newHead = p       newHead: b -> a -> nil
p = temp                p: c -> d -> e -> nil

...

newHead: d -> d -> c -> b -> a -> nil
代码一:
代码语言:javascript
复制
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     public var val: Int
 *     public var next: ListNode?
 *     public init(_ val: Int) {
 *         self.val = val
 *         self.next = nil
 *     }
 * }
 */
class Solution {
  func reverseList(_ head: ListNode?) -> ListNode? {
    if head == nil || head?.next == nil {
        return head
    }
    
     var newHead: ListNode? = ListNode.init(0).next
     var p = head
     while p != nil {
        let tmp = p?.next
        p?.next = newHead
        newHead = p
        p = tmp
     }
    return newHead
  }
}
方案二:
  • 递归:递归找到最后一个节点作为新链表的头节点,然后再更新每一个node的next 值 ,实现链表的反转。而newhead 的值没有发生改变,为该链表的最后一个结点,所以,反转后,我们可以得到新链表的head。

1、找到最后一个节点

递归找到newHead

2、反转最后一个节点head?.next.next = head

反转最后一个节点

3、断链 head?.next = nil

断链

4、递归结束

递归结束,完成反转链表

代码二:
代码语言:javascript
复制
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     public var val: Int
 *     public var next: ListNode?
 *     public init(_ val: Int) {
 *         self.val = val
 *         self.next = nil
 *     }
 * }
 */
class Solution {
  func reverseList(_ head: ListNode?) -> ListNode? {
    if head == nil || head?.next == nil {
        return head
    }

    let newHead = reverseList(head?.next)
    head?.next?.next = head
    head?.next = nil
    return newHead
   }
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018.11.27 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 题目: 反转链表
    • 方案一:
      • 代码一:
        • 方案二:
          • 代码二:
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档