题目:用单链表保存m个整数,结点的结构为【data】【link】,且**|data|<=n(n为正整数)。现要求设计一个时间复杂度尽可能高效**的算法,对于链表中data的绝对值相等的结点,仅保留第一次出现的结点而删除其余绝对值相等的结点。
例如,若给定的单链表head如下:
关键字:带头结点单链表+删除绝对值相同的结点
思路:
关注:
要求时间高效,所以想到用空间换时间,建立辅助数组来存放符合条件的新链表 。
注(* ̄(oo) ̄):不是存放新链表!而是记录旧链表中已出现的数值,方法是:利用位序来代表某个元素的绝对值和0/1来代表是否存在。从而只需对原表进行一趟扫描。
因为|data|<=n,故辅助数组q的大小为n+1,各元素的初值均为0。
依次扫描链表中的各结点,同时检查q|data|的值,若为0则保留该结点,并令q|data|=1,否则将该结点从链表中删除
typedef struct node{
int data;
struct node *next;
}LNode;
voi