链表中倒数第k个结点
题目描述
输入一个链表,输出该链表中倒数第k个结点。
解题思路:
数组的切片
代码:
# -*- coding:utf-8 -*-
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def FindKthToTail(self, head, k):
# write code here
res = []
while head:
res.append(head)
head = head.next
if k>len(res) or k<=0:
return
return res[-k]
法二:两个指针,第一个指针走k步之后,第二个指针开始从头走,这样两个指针之间始终相隔k,当指针1走到链表结尾时,指针2的位置即倒数k个节点
代码:
# -*- coding:utf-8 -*-
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def FindKthToTail(self, head, k):
# write code here
if not head or not k: ##need it! donot delete
return
p1 = head
p2 = head
for i in range(k-1):
if not p1.next:
return
p1 = p1.next
while p1.next:
p1 = p1.next
p2 = p2.next
return p2
反转链表
题目描述
输入一个链表,反转链表后,输出新链表的表头
解题思路:
头插法或是尾插法都可以。
tmp = pHead.next 把当前节点的下一个节点保存下来
pHead.next = pre 把前一个节点移动到当前节点的下一个节点,因为翻转节点,pre始终指向要反转节点的首节点
pre = pHead 当前节点向后移一位
pHead = tmp 把之前保存的下一个节点指针再给当前节点接着翻转
参考:https://blog.csdn.net/songyunli1111/article/details/79416684
代码:
# -*- coding:utf-8 -*-
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
# 返回ListNode
def ReverseList(self, pHead):
# write code here
if not pHead or not pHead.next:
return pHead
pre = None
while pHead:
tmp = pHead.next
pHead.next = pre
pre = pHead
pHead = tmp
return pre