# CSPT23 Lecture 9 ## Playground ``` class LinkedListNode: def __init__(self, value): self.value = value self.next = None self.prev = None def __repr__(self): linkedListStr = '' currNode = self while currNode != None: linkedListStr += f"{str(currNode.value)}->" currNode = currNode.next return linkedListStr a = LinkedListNode(1) b = LinkedListNode(2) c = LinkedListNode(3) a.next = b b.next = c b.prev = a c.prev = b def getElementAtIndex(linkedListNode, index): currIndex = 0 currNode = linkedListNode for i in range(index): currNode = currNode.next return currNode.value def search(linkedListNode, valueToSearchFor): currNode = linkedListNode while currNode != None: if currNode.value == valueToSearchFor: return currNodea currNode = currNode.next return None def insert(linkedListNode, valueToInsert): temp = linkedListNode.next newNodeToInsert = LinkedListNode(valueToInsert) linkedListNode.next = newNodeToInsert newNodeToInsert.next = temp def delete(linkedListNode, valueToDelete): currNode = linkedListNode while currNode.next.value != valueToDelete: currNode = currNode.next if currNode == None: return if currNode != None: currNode.next = currNode.next.next insert(b, 4) insert(b, 4) print(a) delete(a, 4) print(a) ``` ## [Delete Node](https://leetcode.com/problems/delete-node-in-a-linked-list/) ``` # Definition for singly-linked list. # class ListNode: # def __init__(self, x): # self.val = x # self.next = None class Solution: """ Understand 1-->2-->3 remove node 2 1-->3 1-->2-->3 remove node 1 2-->3 """ def deleteNode(self, node): """ :type node: ListNode :rtype: void Do not return anything, modify node in-place instead. """ node.val = node.next.val node.next = node.next.next ``` ## [Reverse Linked List](https://leetcode.com/problems/reverse-linked-list/) ``` # Definition for singly-linked list. # class ListNode: # def __init__(self, val=0, next=None): # self.val = val # self.next = next class Solution: """ Understand input: 1 output: 1 input: 1-->2 output: 2-->1 input: 1-->2-->3 output: 3-->2-->1 """ def reverseList(self, head: ListNode) -> ListNode: curr = head prev = None while curr != None: temp = curr.next curr.next = prev prev = curr curr = temp return prev ``` ## [Odd Even Linked List](https://leetcode.com/problems/odd-even-linked-list/) ``` # Definition for singly-linked list. # class ListNode: # def __init__(self, val=0, next=None): # self.val = val # self.next = next class Solution: """ Construct 2 dummy nodes, one for even and one for odd Insert nodes in the correct list, by keeping track of the current node you're at and what index you're in Keep pointers that point to the tail of the odd list and even list so that you can keep appending easily Merge two lists in the end """ def oddEvenList(self, head: ListNode) -> ListNode: if head == None: return None oddDummyHead = ListNode(-1) oddCurr = oddDummyHead # always points to the tail of the odd list evenDummyHead = ListNode(-1) evenCurr = evenDummyHead # always points to the tail of the even list counter = 1 curr = head while curr != None: if counter % 2 == 0: evenCurr.next = curr evenCurr = evenCurr.next else: oddCurr.next = curr oddCurr = oddCurr.next counter += 1 temp = curr.next curr.next = None curr = temp oddCurr.next = evenDummyHead.next return oddDummyHead.next ```