LintCode Python 简单级题目 451.两两交换链表中的节点

题目描述:

 

给一个链表,两两交换其中的节点,然后返回交换后的链表。

 

样例

给出 1->2->3->4, 你应该返回的链表是 2->1->4->3

 

挑战 

你的算法只能使用常数的额外空间,并且不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。

 

 

题目分析:

你的算法只能使用常数的额外空间,即不能新建链表;

并且不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。

创建三个指针:

  head指向开始交换的节点的上一个节点

  n1指向需要交换的第一个节点,即head.next

  n2指向需要交换的第二个节点,即head.next.next

循环链表,通过head不断交换n1/n2位置即可。

 

源码:

 

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    # @param head, a ListNode
    # @return a ListNode
    def swapPairs(self, head):
        # Write your code here
        new = ListNode(0)
        new.next = head
        head = new
        
        while head.next is not None and head.next.next is not None:
            n1 = head.next
            n2 = head.next.next
            # 交换n1、n2
            head.next = n2
            n1.next = n2.next
            n2.next = n1
            # 交换后的链表,n1在n2后面,将head指向n1
            head = n1
        
        return new.next
        
    # 不创建链表头是否可行?lintcode报超时。
    def _swapPairs(self, head):
        # Write your code here
        if head is None or head.next is None: 
            return head
            
        new = head
        n1 = head
        n2 = head.next
        while n1.next is not None and n2.next is not None:
            n1.next = n2.next
            n2.next = n1
            n1 = n1.next
        return new

 

posted @ 2017-06-07 11:28  刘冬丶  阅读(1551)  评论(0编辑  收藏  举报