# Länkade listor och andra strukturer

## Länkade listor

Fördelar med en länkad lista jämfört med arrayer:

* Som en List behöver man inte definiera storleken från början.
* Det går ganska snabbt att lägga in något nytt i mitten, eller ta bort det.
* Förstår man länkade listor så blir det väldigt lätt att sedan skapa andra strukturer såsom träd eller nätverk.

Nackdelar:

* Mycket jobbiga att sortera.
* Jobbigt att läsa av en specifik position.

### Hur det funkar

En länkad lista består av **noder**. Varje nod innehåller (minst) ett **värde** samt en **pekare** till nästa nod. Det finns ingen samling av alla noder någonstans; allt som finns är pekaren från en nod till en annan.

&#x20;

![](/files/-MILVckt7rr3e_whb7wS)

{% code title="Node.cs" %}

```csharp
class Node
{
  public int value = 0; // Kan såklart göras generisk för mer flexibilitet.
  public Node nextNode;
}
```

{% endcode %}

{% code title="Program.cs" %}

```csharp
Node firstNode = new Node();
firstNode.value = 3;
Node currentNode = firstNode;

// Lägg till 10 noder till den länkade listan
for (int i = 0; i < 10; i++)
{
  firstNode.nextNode = new Node();
  currentNode = firstNode.nextNode;
  currentNode.value = 10 - i;
}

// Stoppa in en nod mellan den första och den andra
Node newNode = new Node();
newNode.value = 9;
newNode.nextNode = firstNode.nextNode;
firstNode.nextNode = newNode;
```

{% endcode %}

## Tvåvägs länkade listor, träd och nätverk

Flera pekare kan peka på samma objekt. Det gör att man kan skapa mer komplexa strukturer.

### Tvåvägs

![En tvåvägs länkad lista](/files/-MILWD7k57Cx92Eb8lkg)

{% code title="Node.cs" %}

```csharp
class Node
{
  public int value = 0;
  public Node nextNode;
  public Node prevNode;
}
```

{% endcode %}

### Träd

![](/files/-MILWMUk6QAe6ow7MnAR)

{% code title="Node.cs" %}

```csharp
class Node
{
  public int value = 0;
  public List<Node> children = new List<Node>();
}
```

{% endcode %}

### Nätverk

![](/files/-MILWQYO8CiCeRrATDcT)

{% code title="Node.cs" %}

```csharp
class Node
{
  public int value = 0;
  public List<Node> connections = new List<Node>();
}
```

{% endcode %}


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://csharp.progdocs.se/tekniker-och-designmonster/laenkade-listor-och-andra-strukturer.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
