【问题标题】:Problem: Swapping two nodes in a Linked List:问题:交换链表中的两个节点:
【发布时间】:2021-03-18 06:48:25
【问题描述】:

这有两种可能的情况:

  1. Node_1Node_2 不是头节点
  2. Node_1Node_2 都是头节点

代码:

def swap_nodes(self, key_1, key_2):
    if key_1 == key_2:
        return
    
    prev_1 = None
    curr_1 = self.head
    while curr_1 and curr_1.data != key_1:
        prev_1 = curr_1
        curr_1 = curr_1.next
        
    prev_2 = None
    curr_2 = self.head
    while curr_2 and curr_2.data != key_1:
        prev_2 = curr_2
        curr_2 = curr_2.next
        
    if not curr_1 or not curr_2:
        return
    
    if prev_1:                            #doubt from here 
        prev_1.next = curr_2              
    else:                               
        self.head = curr_2                
        
    if prev_2:
        prev_2.next = curr_1
    else:
        self.head = curr_1                #doubt till here
        
    curr_1.next, curr_2.next = curr_2.next, curr_1.next

我无法理解这部分提到的疑问。有人可以解释这是如何工作的

【问题讨论】:

    标签: python python-3.x linked-list


    【解决方案1】:

    在单链表中(一个 next 指针,但没有 prev 指针)当你想删除时你必须记住前一个节点或移动一个节点。

    这是您的代码的注释版本:

    def swap_nodes(self, key_1, key_2):
        """Swap nodes containing resp. key1 and key2 values in the linked list starting at head"""
        if key_1 == key_2:           # same values: nothing to do
            return
        
        # search key1 and remember its previous node (prev1 is None <=> key1 in head node)
        prev_1 = None
        curr_1 = self.head
        while curr_1 and curr_1.data != key_1:
            prev_1 = curr_1
            curr_1 = curr_1.next
            
        # same for key2
        prev_2 = None
        curr_2 = self.head
        while curr_2 and curr_2.data != key_1:
            prev_2 = curr_2
            curr_2 = curr_2.next
            
        if not curr_1 or not curr_2:     # one key not found
            return
        
        # make previous nodes of curr1 and curr2 point to the other ("back" links)
        if prev_1:                            # is key1 n head node ?
            prev_1.next = curr_2              # prev1 must point to curr2
        else:                               
            self.head = curr_2                # new head will be curr2
            
        if prev_2:                            # same for second node
            prev_2.next = curr_1
        else:
            self.head = curr_1                #doubt till here
            
        # "back" links are done, now for the direct links (simpler isn't it?)
        curr_1.next, curr_2.next = curr_2.next, curr_1.next
    

    希望现在更清楚...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多