LC 1721 [M] Swapping Nodes in a Linked List - ALawliet/algorithms GitHub Wiki

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def swapNodes(self, head: ListNode, k: int) -> ListNode:
        dum = ListNode(-1, head)
        left = dum # start at -1
        right = head
        
        # increment right n times
        # count from k 1..n instead of 0..n
        while k > 1 and right:
            right = right.next
            k -= 1
        first = right
        
        while right:
            right = right.next
            left = left.next
        second = left
        
        first.val, second.val = second.val, first.val
        
        return dum.next # or head
def swapNodes(self, head: ListNode, k: int) -> ListNode:
        right = head
        left = head

        for _ in range(1, k):
            right = right.next
        first = right

        while right.next:
            right = right.next
            left = left.next
        last = left

        first.val, last.val = last.val, first.val

        return head