首页 > 试题广场 >

两两交换链表的节点

[编程题]两两交换链表的节点
  • 热度指数:2271 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
给你一个链表,请你两两交换相邻节点,你需要真正交换节点本身,而不是修改节点的值。

两两交换示例:
链表    :1->2->3->4
交换后 :2->1->4->3


链表    :1->2->3
交换后: 2->1->3

数据范围:链表长度满足 , 链表上的值满足
示例1

输入

{1,2,3,4}

输出

{2,1,4,3}
示例2

输入

{1,2,3}

输出

{2,1,3}

说明:本题目包含复杂数据结构ListNode,点此查看相关信息
/**
 *  #[derive(PartialEq, Eq, Debug, Clone)]
 *  pub struct ListNode {
 *      pub val: i32,
 *      pub next: Option<Box<ListNode>>
 *  }
 * 
 *  impl ListNode {
 *      #[inline]
 *      fn new(val: i32) -> Self {
 *          ListNode {
 *              val: val,
 *              next: None,
 *          }
 *      }
 *  }
 */
struct Solution{

}

impl Solution {
    fn new() -> Self {
        Solution{}
    }

    /**
    * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
    *
    * 
        * @param head ListNode类 
        * @return ListNode类
    */
    pub fn swapLinkedPair(&self, head: Option<Box<ListNode>>) -> Option<Box<ListNode>> {
        // write code here
        let mut dummy_head = Some(Box::new(ListNode::new(233)));
        dummy_head.as_mut()?.next = head;
        // println!("{}", dummy_head.as_mut()?.val);
        
        let mut p = &mut dummy_head;
        while p.is_some() && p.as_ref()?.next.is_some() && p.as_ref()?.next.as_ref()?.next.is_some() {
            let mut a = p.as_mut()?.next.take();
            let mut b = a.as_mut()?.next.take();
            let mut c = b.as_mut()?.next.take();
            p.as_mut()?.next = b;
            p = &mut p.as_mut()?.next;
            p.as_mut()?.next = a;
            p = &mut p.as_mut()?.next;
            p.as_mut()?.next = c;
        }

        dummy_head?.next
    }
}

发表于 2023-08-17 22:33:16 回复(0)