链表反转很熟悉的面试题,关于链表的基础知识就不再累赘了,如何swift实现链表的反转。
- 传入链表的头结点 返回一个翻转后的头结点
- 两个指针遍历反转
//定义链表节点
class ListNode {
var val: Int
var next: ListNode?
init(_ val: Int) {
self.val = val
self.next = nil
}
}
- 反转函数
func reverList( node: ListNode) -> ListNode {
var last: ListNode?
var next: ListNode?
var nodeH: ListNode? = node
while nodeH != nil {//nodeH 依次尾部移动, nodeH.next 总是last ,中间变量next 为了记录nodeH要向前移动的位置。
next = nodeH?.next
nodeH?.next = last
last = nodeH
nodeH = next
}
//循环结束的条件是nodeH == nil 所以头结点是last
return last!
}
- 测试代码
let alist = ListNode(1)
let blist = ListNode(2)
let clist = ListNode(3)
let dlist = ListNode(4)
alist.next = blist
blist.next = clist
clist.next = dlist
let newlist = reverList(node: alist)
print("=======\(newlist.val)")
print("---------\(newlist.next!.val)")
其他算法参见 故胤道长 Swift 算法实战之路:链表