Write a function to delete a node (except the tail) in a singly linked list, given only access to that node.
写一个方程,删除单链表除尾部节点外的节点,只给定要删除的节点node
Given linked list – head = [4,5,1,9], which looks like following:
4 -> 5 -> 1 -> 9
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:
1、The linked list will have at least two elements.
2、All of the nodes’ values will be unique.
3、The given node will not be the tail and it will always be a valid node of the linked list.
4、Do not return anything from your function.
Solution:
Python
# 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
C++
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
void deleteNode(ListNode* node) {
node->val = node->next->val;
node->next = node->next->next;
}
};
这道题的逻辑是有问题,原则上这个方法删除的不是node这个节点,而是node的下一个节点。原理是先将node的下一个节点的值赋给node,然后删除node的下一个节点。
正常情况下,要删除链表的一个节点,应该给出链表的头和要删除的节点,下面写一下正常链表删除节点的算法:
Python
class ListNode:
def __init__(self,x):
self.val = x
self.next = None
class Solution:
def deletenode(self,head,node):
temp = ListNode(0) #创建辅助头结点,并将head链接到辅助头结点后边
temp.next = head
dummy = temp #dummy永远指向辅助头结点,返回删除node后的链表时,直接返回dummy->next就可以了
while temp.next: #temp指向辅助头结点,遍历原链表,从temp->next开始,temp->next就是原链表的头结点
if temp.next.val == node:
temp.next = temp.next.next #删除temp->next节点,将temp->next->next赋给temp->next即可
else:
temp = temp.next #如果值不等于node,指针向后移动
return dummy.next
C++
struct ListNode{
int val;
ListNode* next ;
ListNode(int x) : val(x), next(NULL) {}
}
class Solution{
public:
ListNode* deletenode(ListNode* head , node){
ListNode* dummy = new ListNode(-1);
dummy->next = head;
ListNode* temp = dummy;
while (temp->next){
if (temp->next->val == node){
temp->next = temp->next->next;
}
else{
temp = temp->next;
}
return dummy->next;
}
}
}