- 题目描述
输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。
例如,一个链表有 6 个节点,从头节点开始,它们的值依次是 1、2、3、4、5、6。这个链表的倒数第 3 个节点是值为 4 的节点。`在这里插入代码片`
示例:
给定一个链表: 1->2->3->4->5, 和 k = 2.
返回链表 4->5.
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/lian-biao-zhong-dao-shu-di-kge-jie-dian-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
-
思路
1、先遍历一遍链表求链表长度,然后减去K值,再从头遍历到差值即可
2、使用快慢指针也行 -
代码:
func getKthFromEnd(head *ListNode, k int) *ListNode {
var len , root = 0, head
for {
if root == nil{
break
}
len ++
root = root.Next
}
for i:=0; i<len-k; i++ {
head = head.Next
}
return head
}
测试代码:
package main
import "fmt"
type ListNode struct {
Val int
Next *ListNode
}
func main() {
//创建链表
list := []int{1,2,3,4,5}
root := &ListNode{Val:list[0]}
tail := root
for i:=1;i<len(list);i++ {
tail.Next = &ListNode{Val:list[i]}
tail = tail.Next
}
//执行程序
root = getKthFromEnd(root,2)
//输出结果
for {
if root == nil{
break
}
fmt.Println(root.Val)
root = root.Next
}
}
func getKthFromEnd(head *ListNode, k int) *ListNode {
var len , root = 0, head
for {
if root == nil{
break
}
len ++
root = root.Next
}
for i:=0; i<len-k; i++ {
head = head.Next
}
return head
}