前言
新的一年,好好学习。
正文
问题来源
本问题来自leetcode上的19题。
问题描述
给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
示例 1:
给定一个链表: 1->2->3->4->5, 和 n = 2.
当删除了倒数第二个节点后,链表变为 1->2->3->5.
分析:
空间换时间
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
func removeNthFromEnd(head *ListNode, n int) *ListNode {
stack := make([]*ListNode, 0)
for head != nil {
stack = append(stack, head)
head = head.Next
}
l := len(stack)
if l == n {
if l == 1 {
return nil
}
return stack[1]
} else {
stack[l-n-1].Next = stack[l-n].Next
return stack[0]
}
}
别人的答案
/**
* 本质上,倒数第n个,只需要设置两个指针,一个走得快,一个走得慢
* 走得快的比走的慢的多走n步就可以,当走的快的到了尾巴,那么也到了倒数第n个的位置了
*
* 这题只需要注意初始的边界调节,比如只有一个且删除第一个怎么办,我是采用多创建了指针,指在头结点之前就好
* */
func removeNthFromEnd(head *ListNode, n int) *ListNode {
if n<=0 || head == nil {
return head
}
fast := head
for i:=1; i<=n && fast!=nil; i++ {
fast = fast.Next
}
if fast == nil {
return head.Next
}
slow := head
for fast.Next != nil {
slow = slow.Next
fast = fast.Next
}
slow.Next = slow.Next.Next
return head
}
总结:
勤思考。
结语
不管怎么样好好加油。