1721. Swapping Nodes in a Linked List

Medium


You are given the head of a linked list, and an integer k.

Return the head of the linked list after swapping the values of the kth node from the beginning and the kth node from the end (the list is 1-indexed).

Example 1:

Input: head = [1,2,3,4,5], k = 2
Output: [1,4,3,2,5]

Example 2:

Input: head = [7,9,6,6,7,8,3,0,9,5], k = 5
Output: [7,9,6,6,8,7,3,0,9,5]

Constraints:

  • The number of nodes in the list is n.

  • 1 <= k <= n <= 105

  • 0 <= Node.val <= 100

# 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: Optional[ListNode], k: int) -> Optional[ListNode]:
        # Distance from last and end is same
        first = second = head
        # Move `first` to kth from start
        for index in range(1,k):
            first = first.next
        temp = first
        # Now move from `first` till end and also move second
        # Once `first` hits end second will be at kth from end of list since distance is same
        while temp.next:
            second = second.next
            temp = temp.next
        first.val, second.val = second.val, first.val
        return head
    
    def swapNodesOld(self, head: Optional[ListNode], k: int) -> Optional[ListNode]:
        arr = []
        while head:
            arr.append(head.val)
            head = head.next
        # (k-1) since it is given as 1-Indexed
        arr[k-1], arr[-k] = arr[-k], arr[k-1]
        new_head = pointer = None
        for num in arr:
            temp = ListNode(num)
            if new_head is None:
                pointer = new_head = temp
            else:
                pointer.next = temp
                pointer = temp
        return new_head
            

Last updated