题目一
1.题目描述
给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
示例:
给定一个链表: 1->2->3->4->5, 和 n = 2.
当删除了倒数第二个节点后,链表变为 1->2->3->5.
说明:给定的 n 保证是有效的。
进阶:
你能尝试使用一趟扫描实现吗?
2.解题思路
使用快慢指针i,j。首先 j 指针先向前走N步,如果此时 j 指向空,说明N为链表的长度,则需要移除的为首元素,那么此时返回 head->next 即可,如果 j 存在,再继续往下走,此时 i 指针也跟着走,直到 j 为最后一个元素时停止,此时 i 指向要移除元素的前一个元素,再修改指针跳过需要移除的元素即可,i.next=i.next.next
注意k>链表长度的情况!
3.代码实现
# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution(object):
def removeNthFromEnd(self, head, n):
"""
:type head: ListNode
:type n: int
:rtype: ListNode
"""
i=head
j=head
for t in range(n):
j=j.next
if not j:
head=head.next
return head
while j.next!=None:
i=i.next
j=j.next
i.next=i.next.next
return head
题目二
1.题目描述
输入一个链表,输出该链表中倒数第k个结点。
2.解题思路
同样利用快慢指针,只不过这次快指针先走k-1步,最后慢指针指向的就是答案。
注意k>链表长度的情况!
3.代码实现
# -*- coding:utf-8 -*-
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def FindKthToTail(self, head, k):
if head==None or k<=0:
return None
# write code here
i=head
j=head
c=0
for c in range(k-1):
j=j.next
if j==None:
return None
while j.next!=None:
i=i.next
j=j.next
return i