题目介绍
难度: 中等
算法:链表
题目
给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
示例:
链表: 1->2->3->4->5, 倒数第n个节点: n = 2.
删除倒数第n(2)个几点,链表变为:1->2->3–>5
算法解析
链表:
python实现链表
class List2Node(object):
def __init__(self):
self.head = None
def add_node(self, item):
temp = List2Node()
temp.value = item
temp.next = self.head
self.head = temp
def print_node(self):
temp = self.head
while temp:
print(temp.value)
temp = temp.next
删除倒数第n个节点,实际上就是将倒数第n-1个节点的next指向倒数第n+1个节点。定义A、B两个节点,遍历链表使A节点与B节点之间相差n个节点,即B节点先遍历到链表第n+1个节点,然后A、B节点同时往前遍历链表直到B节点到达链表尾,这样A节点就处于倒数第n+1个节点。直接赋值:A.next = A.next.next即可删除第n个节点。
还要注意当n大于链表长度的情况,相当于删除头节点,返回head.next即可。
代码实现
整体代码:
class List2Node(object):
def __init__(self):
self.head = None
def add_node(self, item):
temp = List2Node()
temp.value = item
temp.next = self.head
self.head = temp
def print_node(self):
temp = self.head
while temp:
print(temp.value)
temp = temp.next
class Solution(object):
def del_backwards_n_node(self, head, n):
"""
:param head: 链表头节点; n: 倒数第n个节点
:return: 处理后的链表头节点
"""
A = B = head
while n > 0:
B = B.next
n -= 1
if not B:
return head.next
B = B.next
while B:
B = B.next
A = A.next
A.next = A.next.next
return head
if __name__ == '__main__':
node_list = List2Node()
node_list.add_node(1)
node_list.add_node(2)
node_list.add_node(3)
node_list.add_node(4)
node_list.add_node(5)
node_list.print_node()
exa = Solution().del_backwards_n_node(node_list.head, 2)
while exa:
print(exa.value)
exa = exa.next