lintcode练习- 511. 交换链表当中两个节点

511. 交换链表当中两个节点

给你一个链表以及两个权值v1v2,交换链表中权值为v1v2的这两个节点。保证链表中节点权值各不相同,如果没有找到对应节点,那么什么也不用做。

样例

给出链表 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

        
        
        

猜你喜欢

转载自blog.csdn.net/qq_36387683/article/details/81746160
今日推荐