已知一个递增有序的不带头结点的单链表,设计算法从该链表删除与给定值相等的所有元素
时间: 2023-03-26 08:00:39 浏览: 94
可以回答这个问题。算法如下:
1. 定义两个指针,分别指向当前节点和前一个节点。
2. 遍历链表,如果当前节点的值等于给定值,则删除该节点。
3. 如果当前节点的值不等于给定值,则将前一个节点指向当前节点。
4. 遍历完整个链表后,返回链表头节点。
具体实现可以参考以下代码:
struct ListNode* deleteNode(struct ListNode* head, int val) {
struct ListNode *prev = NULL, *curr = head;
while (curr != NULL) {
if (curr->val == val) {
if (prev == NULL) {
head = curr->next;
} else {
prev->next = curr->next;
}
free(curr);
curr = prev == NULL ? head : prev->next;
} else {
prev = curr;
curr = curr->next;
}
}
return head;
}
相关问题
已知带头结点单链表中各结点的元素值为整形且递增有序,设计算法删除链表中所有大于mink且小于maxk的元素,并释放被删结点的空间
1. 初始化指针p为头结点,q为p的后继结点。
2. 如果q非空,则执行以下操作:
a. 如果q的元素值大于mink且小于maxk,则将p的后继结点指向q的后继结点,释放q结点的空间;
b. 否则,将p指向q,q指向p的后继结点。
3. 返回头结点。
代码实现如下:
```
void deleteRange(Node* head, int mink, int maxk) {
Node* p = head;
Node* q = p->next;
while (q != NULL) {
if (q->data > mink && q->data < maxk) {
p->next = q->next;
free(q);
q = p->next;
} else {
p = q;
q = p->next;
}
}
}
```
设计算法将两个递增有序的带头结点的单链表A、B合并为一个递减有序的带头结点的单链表,并要求算法的时间复杂度为两个表长之和的数量级(要求采用链栈或链队列来实现) 。
可以使用链栈来实现该算法,具体步骤如下:
1. 定义两个指针pA和pB,分别指向链表A和B的头结点。
2. 定义一个空的链栈S。
3. 循环执行以下步骤,直到链表A和B都为空:
a. 如果链表A不为空且链表B为空,将链表A中的元素依次入栈S,并将pA指向链表A的下一个节点。
b. 如果链表B不为空且链表A为空,将链表B中的元素依次入栈S,并将pB指向链表B的下一个节点。
c. 如果链表A和B都不为空,比较pA和pB指向的节点的值,将较小的节点入栈S,并将对应的指针向后移动一位。
4. 循环结束后,将栈S中的元素依次出栈,构成一个递减有序的带头结点的单链表C。
时间复杂度为O(m+n),其中m和n分别为链表A和B的长度。
阅读全文