Python Forum
AttributeError: 'NoneType' object has no attribute 'next'
Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
AttributeError: 'NoneType' object has no attribute 'next'
#1
The question is Given the head of a linked list, remove the nth node from the end of the list and return its head.

My code:
class ListNode:
   def __init__(self, val=0, next=None):
       self.val = val
       self.next = next

class Solution:
    def removeNthFromEnd(self, head: ListNode, n: int) -> ListNode:
        total = 0
        temp = head
        while temp is not None:
            temp = temp.next
            total += 1
          
        
        k = total - n
        prev = None
        curr = head
        while k > 0:
            prev.next = curr
            curr = curr.next
            k -= 1
        if prev is None:
            return head.next
        else:
            prev.next = curr.next
        return head
    
list1 = ListNode(2);
list1.next = ListNode(4)
list1.next.next = ListNode(3)
list1.next.next.next = ListNode(5);
list1.next.next.next.next = ListNode(6);
list1.next.next.next.next.next = ListNode(4)
list1.next.next.next.next.next.next = ListNode(7)
s = Solution()
print(s.removeNthFromEnd(list1, 5))
But I got the error at line 19
Quote: File "C:\Code\Leetcode-python\19.py", line 19, in removeNthFromEnd
prev.next = curr

AttributeError: 'NoneType' object has no attribute 'next'

Thanks for the hint.
Reply
#2
        prev = None
        curr = head
        while k > 0:
            prev.next = curr
You set prev = None and nearly then next thing you do is try to set prev.next = curr. But prev is None, and None (NoneType) does not have an attribute named "prev".

Are you being forced to make a linked list only using ListNode? Normally the link is a small part of a linked list, and it is often hidden behind the linked list API. If I was doing this assignment I would make a LinkedList class that had a head and a tail and a size and this kind of problem would be pretty simple to solve. My solution to this problem would be:
class Solution:
    def removeNthFromEnd(self, llist, n):
        llist.remove(len(llist)-n)
        return llist.head

print(Solution().removeNthFromEnd(LinkedList((2, 4, 3, 5, 6, 4, 7))))
loves likes this post
Reply
#3
If you wanted to assume the linked list was "big" (so you didn't want to copy the data), and you want to do only one pass, then you have to keep track of the last n+1 nodes. Could toss them onto a queue or a deque of size n+1.

When you reach the end, the head of the queue either has the previous node (which is the one that has to be modified), or your list is shorter and you might have a special case or two to handle.
Reply


Possibly Related Threads…
Thread Author Replies Views Last Post
  AttributeError: 'NoneType' re.search philnyland 1 299 Jan-20-2024, 03:24 AM
Last Post: deanhystad
Bug TypeError: 'NoneType' object is not subscriptable TheLummen 4 757 Nov-27-2023, 11:34 AM
Last Post: TheLummen
  getpass.getpass() results in AttributeError: module 'os' has no attribute 'O_NOCTTY' EarthAndMoon 4 783 Oct-03-2023, 02:00 PM
Last Post: deanhystad
  TypeError: 'NoneType' object is not callable akbarza 4 1,012 Aug-24-2023, 05:14 PM
Last Post: snippsat
  AttributeError: '_tkinter.tkapp' object has no attribute 'username' Konstantin23 4 1,731 Aug-04-2023, 12:41 PM
Last Post: Konstantin23
  Python: Regex is not good for re.search (AttributeError: 'NoneType' object has no att Melcu54 9 1,510 Jun-28-2023, 11:13 AM
Last Post: Melcu54
  Parallel processing - AttributeError: Can't get attribute 'sktimekmeans' Mohana1983 1 762 Jun-22-2023, 02:33 AM
Last Post: woooee
  Python: AttributeError: 'PageObject' object has no attribute 'extract_images' Melcu54 2 3,914 Jun-18-2023, 07:47 PM
Last Post: Melcu54
  Object attribute behavior different in 2 scripts db042190 1 747 Jun-14-2023, 12:37 PM
Last Post: deanhystad
  cx_oracle Error - AttributeError: 'function' object has no attribute 'cursor' birajdarmm 1 2,386 Apr-15-2023, 05:17 PM
Last Post: deanhystad

Forum Jump:

User Panel Messages

Announcements
Announcement #1 8/1/2020
Announcement #2 8/2/2020
Announcement #3 8/6/2020