题目描述:
题解一(通过):
1.把输入链表中的数值依次读取到一个list nums中。
2.如果n!=1,构造一个val=nums[-1]的node1,如果n=1,则构造val=nums[-2]的node1。
3.从nums倒数第二个位置的数值开始,如果不是需要删除的节点,则构造node val=nums[i] next=node1 更新node1=node
需要注意的有:
1.如果原来链表里只有一个节点,直接返回None。
2.如果原来链表两个节点,判断n=1/n=2,直接返回另一个。
3.按照链表构造方法,先创建最后一个节点,但是在n=1的情况下,最后一个节点被删除,如果n=1,则最后一个节点val=nums[-2],但这种情况可能在之后的for循环中出现重复添加节点的情况,所以采用一个flag数组做记录。
class Solution(object): def removeNthFromEnd(self, head, n): nums = [] while head!=None: nums.append(head.val) head = head.next if len(nums)<=1: return None if len(nums)==2: if n==1: return ListNode(nums[0]) else: return ListNode(nums[1]) flag = [0]*(len(nums)) if n!=1: node1 = ListNode(nums[-1]) flag[-1]=1 else: node1 = ListNode(nums[-2]) flag[-2]=1 for i in range(len(nums)-2,-1,-1): if len(nums)-i!=n and flag[i]==0: node = ListNode(nums[i],next=node1) node1 = node return node
这个方法基本思想就是把链表中所有节点的val保存在nums,然后对除了nums[-n]的节点创建链表。但是提交的时候发现了很多问题,就在原本的基础上进行了修修补补,总体比较乱,方法二是对方法一实现方式的改进。
方法二(通过):
class Solution(object): def removeNthFromEnd(self, head, n): nums = [] while head!=None: nums.append(head.val) head = head.next if len(nums)<=1: return None if len(nums)==2: if n==1: return ListNode(nums[0]) else: return ListNode(nums[1]) head = ListNode() ans = head for i in range(0,len(nums)): if len(nums)-i != n: node = ListNode(nums[i]) head.next = node return ans.next