511. 交换链表当中两个节点
给你一个链表以及两个权值v1
和v2
,交换链表中权值为v1
和v2
的这两个节点。保证链表中节点权值各不相同,如果没有找到对应节点,那么什么也不用做。
样例
给出链表 1->2->3->4->null
,以及 v1
= 2
, v2
= 4
返回结果 1->4->3->2->null
。
注意事项
你需要交换两个节点而不是改变节点的权值
实现思路:
为了操作简单, 定义三种变量,记录前一个节点prev,当前节点curr,下一个节点next。
遍历链表,如果找到两个节点就返回,如果遍历完,没有找到两个节点,不做处理直接返回head。
对两个权值节点进行判断,如果两个权值结点相邻,需要特殊处理。
"""
Definition of ListNode
class ListNode(object):
def __init__(self, val, next=None):
self.val = val
self.next = next
"""
class Solution:
"""
@param head: a ListNode
@param v1: An integer
@param v2: An integer
@return: a new head of singly-linked list
"""
def swapNodes(self, head, v1, v2):
# write your code here
if head is None or head.next is None:
return head
dummy = ListNode(0)
dummy.next = head
pre, cur = dummy, head
prev1, prev2 = None, None
curr1, curr2 = None, None
next1, next2 = None, None
while cur:
#找到两个权值就返回
if curr1 and curr2:
break
if cur.val == v1:
prev1 = pre
curr1 = cur
next1 = cur.next
if cur.val == v2:
prev2 = pre
curr2 = cur
next2 = cur.next
pre = cur
cur = cur.next
#没有找到两个权值,不做改变直接返回
if not curr1 or not curr2:
return head
#即两个权值相邻
if next1 == curr2:
prev1.next = curr2
curr2.next = curr1
curr1.next = next2
elif next2 == curr1:
prev2.next = curr1
curr1.next = curr2
curr2.next = next1
else:
prev1.next = curr2
curr2.next = next1
prev2.next = curr1
curr1.next = next2
return dummy.next