删除双向链表中给定节点后的节点

时间:2017-07-27 02:42:34

标签: c++ doubly-linked-list

我正在尝试在我的类中编写一个函数,该函数接收一个节点并在双链表中直接删除该节点。我有单独的函数删除第一个或最后一个节点,所以这只是在中间节点的情况下。我认为它的逻辑是有意义的,我的代码编译,但当我尝试测试它时,程序永远不会停止运行,所以我认为它会陷入while循环。我也不确定我是否正确调用了该函数。在由DLL123填充的名为4的双重链接列表中,我尝试通过{3删除DLL.removeAfter(2)主要是{1}}。我看到这在逻辑上是有缺陷的,因为列表中可能存在多个2,但我不知道什么是正确的。

void DoublyLinkedList::removeAfter(const DListNode &p)
{
    DListNode *node = header.next;
    while(node != &p)
    {
        node->next; //iterate to p;
    }
    node->next; //Get to the node after p that is to be deleted
    node->prev->next = node->next;
    node->next->prev = node->prev;
    delete node;
}

3 个答案:

答案 0 :(得分:0)

我认为您要将 .section __TEXT,__text,regular,pure_instructions .macosx_version_min 10, 12 .globl _main .p2align 4, 0x90 _main: ## @main .cfi_startproc ## BB#0: pushq %rbp Ltmp0: .cfi_def_cfa_offset 16 Ltmp1: .cfi_offset %rbp, -16 movq %rsp, %rbp Ltmp2: .cfi_def_cfa_register %rbp subq $16, %rsp movl $20, -8(%rbp) movl $30, -4(%rbp) leaq L_.str(%rip), %rdi movl $10, %esi xorl %eax, %eax callq _printf xorl %eax, %eax addq $16, %rsp popq %rbp retq .cfi_endproc .section __TEXT,__cstring,cstring_literals L_.str: ## @.str .asciz "%d %d %d\n" .subsections_via_symbols 的两个实例替换为node->next,否则您永远不会更改node = node->next的值。

答案 1 :(得分:0)

void DoublyLinkedList::removeAfter(const DListNode &p)
{
    DListNode *node = header.next;

    while(node != &p) {
        node = node->next; //iterate to p;
    }

    DListNode* del_note = node->next; //Get to the node after p that is to be deleted
    node->next = del_note->next;
    del_note->next->prev = node;

    delete del_note;
}

当然,这只会在找到第一个元素时找到while个中断。

答案 2 :(得分:0)

public class MyStartServiceReceiver extends BroadcastReceiver {


    @Override
    public void onReceive(Context context, Intent intent) {
        Log.e("AlarmReceiver", "Started");
        Intent intent1 = new Intent(context, AlarmService.class);
        intent1.setData(Uri.parse("custom://" + System.currentTimeMillis()));
        context.startService(intent1);
    }
}