题目链接:https://leetcode-cn.com/problems/lian-biao-zhong-dao-shu-di-kge-jie-dian-lcof/
我的解法:
很直接
- 先遍历一次链表,得到链表的长度。新建变量指向头部,不能动head指针
- 返回n-k的位置
参考解法
- 定义两个指针former,latter分别指向链表的头部
- former指针向后移动k步
- fomer 和 latter 同时向后移动,当former移到尾部时,返回latter,即为倒数第K个节点
示例:
数组:[1, 2, 3, 4, 5, 6, 7], k=2
- 定义两个指针former,latter分别指向链表的头部
- former 向后移动k步,指向3. 此时latter指向头部1
- former向后移动到链表尾部,latter指向6
- 返回latter指针
# Definition for singly-linked list.
# 参考解法
'''
'''
class ListNode:
def __init__(self, x):
self.val = x
self.next = None
class Solution:
def getKthFromEnd(self, head: ListNode, k: int) -> ListNode:
if not head:
return
former,latter = head,head
for i in range(k):
former = former.next
while former:
former = former.next
latter = latter.next
return latter
我的解法
class Solution1:
def getKthFromEnd(self, head: ListNode, k: int) -> ListNode:
length = 1
if head.val == None:
return
p = head
while p.next != None:
p = p.next
length += 1
count = 0
while head.val != None:
if count == length - k:
return head
else:
head = head.next
count += 1
后面找出n-k
的部分也可以改写成
for i in range(length-k):
head = head.next
return head
倒数第K个,即去掉前面n-k
个数
剑指offer中提到3个坑
- 链表为空
- k=0
- k>链表长度,导致former便利到None后继续向后遍历
1、2链表为空或者k=0,返回的都为空.
避免k>链表长度
仍向后遍历,在former
向后移动的时候,增加判断former
是否为空
class ListNode:
def __init__(self, x):
self.val = x
self.next = None
class Solution:
def getKthFromEnd(self, head: ListNode, k: int) -> ListNode:
if not (head and k):
return
former,latter = head,head
for i in range(k):
if former:
former = former.next
else:
return
while former:
former = former.next
latter = latter.next
return latter
我的解法中,增加判断k>length?