Alice
Alice

Reputation: 1400

Delete node from singly LinkedList in a straightforward way

I am learning LinkedList from an easy leetcode problem Delete Node in a Linked List - LeetCode

Write a function to delete a node (except the tail) in a singly linked list, given only access to that node.

Given linked list -- head = [4,5,1,9], which looks like following:

enter image description here

Example 1:

Input: head = [4,5,1,9], node = 5
Output: [4,1,9]
Explanation: You are given the second node with value 5, the linked list should become 4 -> 1 -> 9 after calling your function.

Example 2:

Input: head = [4,5,1,9], node = 1
Output: [4,5,9]
Explanation: You are given the third node with value 1, the linked list should become 4 -> 5 -> 9 after calling your function.

Note:

  • The linked list will have at least two elements.
  • All of the nodes' values will be unique.
  • The given node will not be the tail and it will always be a valid node of the linked list.
  • Do not return anything from your function.

And the official solution:

Replace the value of the node you want to delete with the value in the node after it, and then delete the node after it.

# Definition for singly-linked list.
class ListNode:
    def __init__(self, x):
        self.val = x
        self.next = None

   class Solution:
        def deleteNode(self, node):
            """
            :type node: ListNode
            :rtype: void Do not return anything, modify node in-place instead.
            """
            node.val = node.next.val 
            node.next = node.next.next 

I thought it cumbersome, so changed it to:

class Solution:
    def deleteNode(self, node):
        node= node.next

Assign the next node to the current node in a straightforward way

Unfortunately, it reports wrong answer.

I cannot figure out why it's not working.

The logic is free of bugs : the current node was shadowed by its next node,

Upvotes: 1

Views: 244

Answers (1)

recnac
recnac

Reputation: 3744

Here is what we want to do, delete node:

pre -> node -> post => pre -> post

So what you should do is change pre.next from node to node.next. like:

pre.next = node.next

If you do node = node.next, it only change the node reference.

It has no any effect on original ListNode.

But we can not get pre in this scenario, so we have to change node value to become to post, and remove post.

Hope that helps you, and comment if you have further questions. : )

Upvotes: 2

Related Questions