链表-元素在删除后出现

时间:2019-11-21 03:51:35

标签: c++ c++11 pointers linked-list

我有一个import React from 'react' import './style.css' class FormSample extends React.Component{ constructor(props){ super(props); this.state={ fname:'', lname:'', email:'', subject:'', data:[] } } handleFormSubmit(event){ event.preventDefault(); let items = [...this.state.data] items.push({ fname: this.state.fname, lname: this.state.lname, email: this.state.email, subject: this.state.subject }); this.setState({ items, // fname:'', // lname:'', // email:'', // subject:'', }) console.log(this.state) } render(){ return( <div className="formData"> <p>Contact me</p> <div> <form action="#"> <label>first name</label> <input type="text" id="fname" name="firstname" placeholder="your name..." value={this.state.fname} onChange={e => this.setState({fname: e.target.value})}/> <label>last name</label> <input type="text" id="lname" name="lastname" placeholder="last name.." value={this.state.lname} onChange={e => this.setState({lname: e.target.value})}/> <label>Email</label> <input type="email" id="email" name="email" placeholder="email" value={this.state.email} onChange={e => this.setState({email: e.target.value})}/> <label>Subject</label> <textarea id="subject" name="subject" placeholder="write..." value={this.state.subject} onChange={e => this.setState({subject: e.target.value})}/> <input type="submit" value="submit" onClick={e => this.handleFormSubmit(e)}/> </form> </div> </div> ) } } export default FormSample; 类来实现链接列表:

Node

在解决方案类中,我有插入,removeDuplicates,打印等方法;

现在class Node { public: int data; Node *next; Node(int d){ data=d; next=NULL; } }; ,我的逻辑是:

  • 如果我当前的下一个节点为null,则返回
  • 如果当前值等于当前下一个值,则在当前值旁边设置
  • 下一个递归

这是我的代码:

removeDuplicates

当我调用Node* removeDuplicates(Node* head) { process(head); return head; } void process(Node* node) { cout << node->data << endl; if(node->next==NULL) return; if(node->data==node->next->data) node=node->next; process(node->next); } 方法时,它会打印: removeDuplicate 如预期的那样,但是在此之后,当我再次使用另一种方法打印时,它将为我提供整个链接列表,而不会删除重复项: 1 2 3 4

1 2 2 3 3 4方法:

display

3 个答案:

答案 0 :(得分:1)

问题出在您的流程功能中,请参阅下面的修改后的代码

 void process(Node* node)
 {
    cout << node->data << endl;
    if(node->next==NULL)
       return;
    if(node->data==node->next->data) {

       Node *tmp = node->next; 
       node->next = tmp->next;   
       delete(tmp); 
       //  node=node->next;

    }
    process(node->next);
 }

答案 1 :(得分:0)

下面显示的是代码中的行,您可以在其中重复执行代码。

 if(node->data==node->next->data)
       node=node->next;

因此,您在这里所做的就是使节点指针移动到下一个节点。您应该编写代码,以便在重复的情况下跳过下一个节点,并且只能通过操纵当前节点的下一个指针来做到这一点。如下所示:

 if(node->data==node->next->data)
       node->next=node->next->next;

答案 2 :(得分:0)

如果您想保留代码的逻辑并获得预期的结果,则只需要添加一个字符即可。 您需要更换

void process(Node* node) {...}

使用

void process(Node*& node) {...}

输出将如您所愿。