问题描述
删除链表中倒数第n个节点 例:1->2->3->4->5,n = 2 ,返回 1->2->3->5
解题思路
是快行指针,这次两个指针移动的速度相同。但是一开始,第一个指针(在指向头节点之前)就落后第二个指针n节点。接着两者同时移动,当第二个指针移动到尾结点时,第一个节点的下一个节点就是我们要删除的节点
func p_removeNthFromEnd(head: ListNode?, n: Int) -> ListNode? {
guard let head = head else {
return nil
}
let dummy = ListNode.init(val: 0)
dummy.next = head
var prev: ListNode? = dummy
var post: ListNode? = dummy
//设置后一个节点初始位置
for _ in 0..<n{
if post == nil{
break
}
post = post!.next
}
//同时移动前后节点
while post != nil && post!.next != nil {
prev = prev!.next
post = post!.next
}
//删除节点
prev!.next = prev!.next!.next
return dummy.next
}
测试
@objc func removeNthFromEnd()
{
let one = ListNode.init(val: 1)
let two = ListNode.init(val: 2)
let three = ListNode.init(val: 3)
let four = ListNode.init(val: 4)
let five = ListNode.init(val: 5)
one.next = two
two.next = three
three.next = four
four.next = five
let result = self.p_removeNthFromEnd(head: one, n: 2)
var dummy = result
while dummy != nil {
print("node val: \(dummy!.val)")
dummy = dummy?.next
}
}