Skip to content

Instantly share code, notes, and snippets.

@OkiStuff
Last active June 21, 2023 23:41
Show Gist options
  • Save OkiStuff/80423f17ba6f71b1905bc6371377ee13 to your computer and use it in GitHub Desktop.
Save OkiStuff/80423f17ba6f71b1905bc6371377ee13 to your computer and use it in GitHub Desktop.
Doubly Linked List in Powershell
param($ArrayIn)
class Node {
$Value
[Node]$Next
[Node]$Previous
Node($value, [Node]$next, [Node]$previous) {
$this.Value = $value
$this.Next = $next
$this.Previous = $previous
}
[Node]Traverse([int]$offset) {
$ListPointer = $this
if ($offset -eq -1) {
# Traverse to end
while($ListPointer.Next -ne $null) {
$ListPointer = $ListPointer.Next
}
return $ListPointer
} elseif ($offset -lt 0) {
return $null
} elseif ($offset -eq 0) {
return $this
}
for ($i = 0; $i -lt $offset; $i++) {
if ($ListPointer.Next -ne $null) {
$ListPointer = $ListPointer.Next
} else {
break
}
}
return $ListPointer
}
[Node]TraverseBackwards([int]$offset) {
$ListPointer = $this
if ($offset -eq -1) {
# Traverse Backwards to end
while($ListPointer.Previous -ne $null) {
$ListPointer = $ListPointer.Previous
}
return $ListPointer
} elseif ($offset -lt 0) {
return $null
} elseif ($offset -eq 0) {
return $this
}
for ($i = 0; $i -lt $offset; $i++) {
if ($ListPointer.Previous -ne $null) {
$ListPointer = $ListPointer.Previous
} else {
break
}
}
return $ListPointer
}
[Node]Append($value) {
$NextNode = $this.Next
$this.Next = [Node]::new($value, $NextNode, $this)
if ($NextNode -ne $null) {
$NextNode.Previous = $this.Next
}
return $this.Next
}
[Node]AppendToEnd($value) {
return $this.Traverse(-1).Append($value)
}
[Node]AppendToHead($value) {
return $this.TraverseBackwards(-1).Append($value)
}
[Node]Insert([int]$offset, $value) {
if ($offset -eq 0) {
$this.Append($value)
} elseif ($offset -lt 0) {
return $this.TraverseBackwards(-$offset).Append($value)
}
return $this.Traverse($offset).Append($value)
}
DeleteThis() {
$this.Previous.Next = $this.Next
}
Delete([int]$offset) {
if ($offset -eq 0) {
$this.DeleteThis()
} elseif ($offset -lt 0) {
$this.TraverseBackwards(-$offset).DeleteThis()
return
}
$this.Traverse($offset).DeleteThis()
}
}
function Print-List {
param(
[Node]$Head
)
$i = 0
for ($current = $Head; $current -ne $null; $current = $current.Next) {
$i++
Write-Host ("Node {0}: {1}" -f $i, $current.Value)
}
}
$Head = [Node]::new($ArrayIn[0], $null, $null)
for ($i = 1; $i -lt $ArrayIn.Length; $i++) {
[void]$Head.AppendToEnd($ArrayIn[$i])
}
Print-List $Head
class Node {
[int]$Value
[Node]$Next
[Node]$Previous
Node([int]$value, [Node]$next, [Node]$previous) {
$this.Value = $value
$this.Next = $next
$this.Previous = $previous
}
[Node]Traverse([int]$offset) {
$ListPointer = $this
if ($offset -eq -1) {
# Traverse to end
while($ListPointer.Next -ne $null) {
$ListPointer = $ListPointer.Next
}
return $ListPointer
} elseif ($offset -lt 0) {
return $null
} elseif ($offset -eq 0) {
return $this
}
for ($i = 0; $i -lt $offset; $i++) {
if ($ListPointer.Next -ne $null) {
$ListPointer = $ListPointer.Next
} else {
break
}
}
return $ListPointer
}
[Node]TraverseBackwards([int]$offset) {
$ListPointer = $this
if ($offset -eq -1) {
# Traverse Backwards to end
while($ListPointer.Previous -ne $null) {
$ListPointer = $ListPointer.Previous
}
return $ListPointer
} elseif ($offset -lt 0) {
return $null
} elseif ($offset -eq 0) {
return $this
}
for ($i = 0; $i -lt $offset; $i++) {
if ($ListPointer.Previous -ne $null) {
$ListPointer = $ListPointer.Previous
} else {
break
}
}
return $ListPointer
}
[Node]Append([int]$value) {
$NextNode = $this.Next
$this.Next = [Node]::new($value, $NextNode, $this)
if ($NextNode -ne $null) {
$NextNode.Previous = $this.Next
}
return $this.Next
}
[Node]AppendToEnd([int]$value) {
return $this.Traverse(-1).Append($value)
}
[Node]AppendToHead([int]$value) {
return $this.TraverseBackwards(-1).Append($value)
}
[Node]Insert([int]$offset, [int]$value) {
if ($offset -eq 0) {
$this.Append($value)
} elseif ($offset -lt 0) {
return $this.TraverseBackwards(-$offset).Append($value)
}
return $this.Traverse($offset).Append($value)
}
DeleteThis() {
$this.Previous.Next = $this.Next
}
Delete([int]$offset) {
if ($offset -eq 0) {
$this.DeleteThis()
} elseif ($offset -lt 0) {
$this.TraverseBackwards(-$offset).DeleteThis()
return
}
$this.Traverse($offset).DeleteThis()
}
}
function Print-List {
param(
[Node]$Head
)
$i = 0
for ($current = $Head; $current -ne $null; $current = $current.Next) {
$i++
Write-Host ("Node {0}: {1}" -f $i, $current.Value)
}
}
$Head = [Node]::new(10, $null, $null)
$n1 = $Head.AppendToEnd(11)
$n2 = $Head.AppendToEnd(12)
[void]$Head.AppendToEnd(15)
$n1.DeleteThis()
[void]$Head.Insert(1,50)
$n2.Delete(2)
[void]$n2.AppendToHead(16)
[void]$n2.AppendToHead(18)
$n2.Delete(-2)
Print-List $Head
$Head.Traverse(2)
$n2.TraverseBackwards(-1)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment