LintCode:Swap Two Nodes in Linked List
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
# @param {ListNode} head, a ListNode
# @oaram {int} v1 an integer
# @param {int} v2 an integer
# @return {ListNode} a new head of singly-linked list
def swapNodes(self, head, v1, v2):
# Write your code here
if head == None or v1 == v2:
return head
p1 = head
p2 = head
if head.val != v1 and head.val != v2:
while p1.next != None and p1.next.val != v1:
p1 = p1.next
while p2.next != None and p2.next.val != v2:
p2 = p2.next
if p1.next == None or p2.next == None:
return head
if p1.next != p2 and p2.next != p1:
p3 = p2.next
p5 = p2.next.next
p3.next = p1.next.next
p4 = p1.next
p4.next = p5
p1.next = p3
p2.next = p4
return head
elif p2.next == p1:
p3 = p1.next
p4 = p1.next.next
p3.next = p1
p1.next = p4
p2.next = p3
return head
elif p1.next == p2:
p3 = p2.next
p4 = p2.next.next
p3.next = p2
p2.next = p4
p1.next = p3
return head
if head.val == v2:
while p1.next != None and p1.next.val != v1:
p1 = p1.next
if p1.next == None or p2.next == None:
return head
if p1 != p2:
p3 = p1.next
p4 = p1.next.next
p5 = p2.next
p3.next = p5
p1.next = p2
p2.next = p4
head = p3
return head
if p1 == p2:
p3 = p1.next
p4 = p1.next.next
p5 = p2.next
p2.next = p4
p3.next = p2
head = p3
return head
if head.val == v1:
while p2.next != None and p2.next.val != v2:
p2 = p2.next
if p1.next == None or p2.next == None:
return head