Lista jednokierunkowa funkcja deleteBefore

0

Witam, pisze sobie implementacje listy jednokierunkowej na zajęcia mam taki kod:

#include<iostream>
using namespace std;

struct Node
{
	int val;
	Node *next;
};

void insertHead(Node *&head, int val)
{
	Node *newNode = new Node;
	newNode->val = val;
	newNode->next = head;
	head = newNode;
}
void insertAfter(Node *item, int val)
{
	Node *nowy = new Node;
	nowy->val = val;
	nowy->next = item->next;
	item->next = nowy;

}
void deleteList(Node *&head) {
	Node *tmp;
	while(head != NULL) {
		tmp = head;
		head = tmp->next;
		delete tmp;
	}
}
bool deleteItem(Node *&item) {
	Node *tmp = item->next;
	if(tmp != NULL) {
		item->val = tmp->val;
		item->next = tmp->next;
		delete tmp;
		return true;
	}
	return false;
}
void deleteAfter(Node *&item)
{
	Node *tmp = item->next;
	item->next = tmp->next;
	delete tmp;
}
void deleteBefore(Node *&head, Node *&item);

void insertBefore(Node *item, int val) {
	Node *tmp = new Node;
	tmp->val = item->val;
	item->val = val;
	tmp->next = item->next;
	item->next = tmp;

}
void printList(Node *head)
{

	while( head != NULL )
	{
		cout << head->val << "  ";
		head = head->next;
	}
	cout << endl;
}
Node* findValue(Node *head, int Value)
{
	Node *found = new Node;
	while(head != NULL)
	{

		if (head->val == Value)
		{
			found->val = head->val;
			found->next = head->next;
			return found;
		} 
		head = head->next;
	}
	return NULL;
}

int main()
{
	Node *head = NULL;
	insertHead(head,0);
	insertHead(head,1);
	insertHead(head,3);
	insertHead(head,4);


	printList(head);
	deleteAfter(head);
	printList(head);

	system("pause");
	return 0;
} 

Mam problem z funkcja deleteBefore która będzie usuwała węzeł przed wskazanym i zastanawiam się czy jest możliwe napisanie tej funkcji jeśli nie możemy odnieść się do poprzedniego elementu w liście

0

Jest możliwe, jeśli zgodzisz się na to że będziesz miał złożonośc liniową - po prostu przechodzisz od głowy pamiętając poprzedni aż trafisz na element usuwany i usuwasz go normalnie.

0

Kto wymyślił takie bzdury jak DeleteBefore/InsertBefore na liście jednokierunkowej?
Przecież to się mija z sensem. Niech zwycięży technologia nad zdrowym rozsądkiem!

1 użytkowników online, w tym zalogowanych: 0, gości: 1