{链表操作}

From 剑指Offer 何海涛 著

#include <iostream>

struct ListNode {
    int m_nValue;
    ListNode *m_pNext;
};

void AddToTail(ListNode **head, int value) {
    if(head != NULL) {
        ListNode **curr = head;
        while(*curr != NULL) {
            curr = &(*curr)->m_pNext; // 注意: 这里是要移动指针, 而非改变这个指针指向的数据!
        }
        *curr = new ListNode;         // 注意: 这里是要改变这个指针指向的数据, 而非移动指针!
        (*curr)->m_nValue = value;
        (*curr)->m_pNext = NULL;
    }
}

void RemoveNode(ListNode **head, int value) {
    if(head != NULL && *head != NULL) {
        ListNode **curr = head;
        while(*curr != NULL && (*curr)->m_nValue != value) {
            curr = &(*curr)->m_pNext; // 注意: 这里是要移动指针, 而非改变这个指针指向的数据! 
        }
        if(*curr != NULL) {
            ListNode *toBeDeleted = *curr;
            *curr = (*curr)->m_pNext; // 注意: 这里是要改变这个指针指向的数据, 而非移动指针!
            delete toBeDeleted;
        }
    }
}

测试集:

void PrintList(const ListNode *head) {
    const ListNode *curr = head;
    while(curr != NULL) {
        std::cout << curr->m_nValue << " -> ";
        curr = curr->m_pNext;
    }
    std::cout << "NULL" << std::endl;
}

int main(int argc, char *argv[]) {
    ListNode *head = NULL;
    AddToTail(&head, 1);
    AddToTail(&head, 2);
    AddToTail(&head, 3);
    AddToTail(&head, 4);
    AddToTail(&head, 5);
    PrintList(head);
    
    RemoveNode(&head, 1);
    PrintList(head);
    RemoveNode(&head, 1);
    PrintList(head);
    RemoveNode(&head, 3);
    PrintList(head);
    RemoveNode(&head, 5);
    PrintList(head);
    RemoveNode(&head, 2);
    PrintList(head);
    RemoveNode(&head, 4);
    PrintList(head);
    
    return 0;
}

 

posted @ 2015-04-19 15:07  long#long  阅读(133)  评论(0编辑  收藏  举报