Write a function to delete a node (except the tail) in a singly linked list, given only access to that node.
Supposed the linked list is 1 -> 2 -> 3 -> 4
and you are given the third node with value 3
, the linked list should become 1 -> 2 -> 4
after calling your function.
思路:因为不知道前驱元素的地址,所以只能用后继元素覆盖。因为保证删除的不是最后一个元素,所以这个方法是有效的。
leetcode上有解答,有图有真相。https://leetcode.com/articles/delete-node-linked-list/
#include<cstdio>
#include<iostream>
#include<malloc.h>
using namespace std;
struct ListNode
{
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL)
{ }
};
/****************************提交部分****************************/
class Solution
{
public:
void deleteNode(ListNode* node)
{
if(NULL==node)
return;
node->val=node->next->val;
node->next=node->next->next;
}
};
/****************************************************************/
int main()
{
int n;
scanf("%d",&n);
ListNode *first,*tail,*p;
first=tail=NULL;
int tmp;
while(n--)
{
p=(ListNode*)malloc (sizeof(ListNode));
scanf("%d",&tmp);
p->val=tmp;
p->next=NULL;
if(first==NULL)
first=p;
else
tail->next=p;
tail=p;
}
p=first;
printf("删除之前:\n");
while(p!=NULL)
{
printf("%d ",p->val);
p=p->next;
}
printf("\n");
ListNode *node;
int del;
scanf("%d",&del);
printf("删除之后:\n");
for(node=first; node!=NULL; node++)
{
if(node->val==del)
{
printf("Node:%d\n",node->val);
break;
}
}
Solution S;
S.deleteNode(node);
p=first;
while(p!=NULL)
{
printf("%d ",p->val);
p=p->next;
}
printf("\n");
return 0;
}
做这题的时候最困扰我的是单链表的创建与赋值,要用到三个指针才能完成。
还有一点让我感觉奇怪的是,这个程序或许不太稳定,因为输入1 2 3 4而删除2的时候,有时候运行到输出Node:2之后就崩了,有时候又能顺利运行到最后,求解。。。