题目一:删除链表中的节点:
1、时间复杂度为O(n),找到要删除链表的前一个节点,将该节点的next指向要删除的链表的next,然后删除该节点并置为NULL;
2、时间复杂度为O(1),将要删除节点的后面的节点的值赋给删除的节点,将删除节点的next指向后面节点的next,然后删除后面的节点并置为NULL;
注意:要考虑只有一个节点的情况,删除头节点也是尾节点;还要考虑如果要删除的节点是尾节点的情况,时间复杂度为O(n),要顺序遍历到尾节点的前一个节点,然后删除置为NULL;上述两种方法是基于要删除的节点确实在链表中时
题目二:删除链表中重复的节点:
注意:需要考虑头节点重复时,删除头节点,重新修改头节点的情况
思路一:两次遍历,第一次遍历将重复的节点放入set容器,第二次遍历,若节点存在于set容器,则删除该节点;
思路二:遍历的时候删除重复节点;
思路三、递归实现,思路简单,但当链表基本无重复节点时,效率不高
思路二代码:
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};
*/
class Solution {
public:
ListNode* deleteDupli