//示例:
//输入: 1->2->3->4->5->NULL
//输出: 5->4->3->2->1->NULL
//进阶:
//你可以迭代或递归地反转链表。你能否用两种方法解决这道题?
class ListNode {
var val: Int
var next: ListNode?
init(_ val: Int) {
self.val = val
self.next = nil
}
}
class Solution {
var head: ListNode? = nil
var current: ListNode? = nil
func appendElement(_ data: Int) {
if head == nil {
head = ListNode(data)
current = head
} else {
current?.next = ListNode(data)
current = current?.next
}
}
//初始化
func initNode() -> ListNode{
for index in 1...5 {
self.appendElement(index)
}
return head ?? ListNode(0)
}
//求链表长度
func getLenght(_ head: ListNode?) -> Int {
if head == nil {
return -1
}
var lenght = 0
current = head
while current != nil {
lenght += 1
current = current?.next
}
return lenght
}
//迭代法实现链表反转
func reverseList(_ head: ListNode?) -> ListNode? {
var cur: ListNode? = nil
var pre: ListNode? = head
while pre != nil {
let temp = pre?.next
pre?.next = cur
cur = pre
pre = temp
}
return cur
}
//递归法实现链表反转
func reverseList2(_ head: ListNode?) -> ListNode? {
if head == nil || head?.next == nil {
return head
}
let newNode = reverseList2(head?.next)
head?.next?.next = head
head?.next = nil
return newNode
}
//打印链表
func println(_ node: ListNode?) {
guard let node = node else {
return
}
current = node
while current != nil {
print("\(current?.val ?? 0)")
current = current?.next
}
}
}
//应用调用
let solution = Solution()
let node = solution.initNode()
print("--------反转前-------")
solution.println(node)
let newNode1 = solution.reverseList(node)
print("--------反转后-------")
solution.println(newNode1)
let newNode = solution.reverseList2(newNode1)
print("--------再次反转后-------")
solution.println(newNode)
print("链表长度:", solution.getLenght(newNode))