链表-(删除链表中倒数第n个节点)的两种算法

常规方法:

# -*- coding:utf-8 -*-

""" 
Author: leadingme
Mail:[email protected]
MyWebsite:leadingme.top
"""

# 删除链表的倒数第n个节点
"""
    算法要求: 给定一个链表,删除链表的倒数第n个节点,并且返回链表的头结点(不带头结点)
    示例:
        给定一个链表 1->2->3->4->5, n=2
        当删除倒数第二个节点后,链表变为1->2->3->5
"""

def removeNthFromEnd(head, n):
    """
    :param head:
    :param n:
    :return:
    """
    pointer = head
    length = 0
    while pointer:       # 求出链表的长度(包含头结点)
        pointer = pointer.next
        length += 1
    if length == 1: # 链表为空
        return None
	pointer = head
    if n >= length:   # 删除的节点为第一个节点, 删除头节点
        head.next = head.next.next
    else:
        if n == 1:   # 删除的节点为最后一个节点, 删除尾节点
            for i in range(length-2):
                pointer = pointer.next
            pointer.next = None
        else:       # 删除的节点为中间某个节点
            for i in range(length-n-1):
                pointer = pointer.next
            pointer.next = pointer.next.next
    return head

进阶方法:

def removeNthFromEnd2(head, n):
    """
    :param head:
    :param n:
    :return:
    """
    if head is None: # 如果链表为空,则返回None
        return None
    left = right = head
    si = 0
    while si < n:
        si += 1
        right = right.next
    if right is None:   # right为None,right移动到尾节点, 删除第一个节点
        head= head.next
        return head
    while right.next is not None:
        left = left.next
        right = right.next
    if n == 1:         # 删除最后一个节点
        left.next = None
    else:
        left.next = left.next.next
    return head

有问题欢迎交流讨论,评论区留言博主看到回第一时间回复

发布了54 篇原创文章 · 获赞 24 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/weixin_43388615/article/details/105272792
今日推荐