24. 两两交换链表中的节点

题目描述

给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。

解题思路

? 还是一边出 一边入

#![allow(unused)]

fn main() {
struct Solution {}

// Definition for singly-linked list.
#[derive(PartialEq, Eq, Clone, Debug)]
pub struct ListNode {
  pub val: i32,
  pub next: Option<Box<ListNode>>
}

impl ListNode {
  #[inline]
  fn new(val: i32) -> Self {
    ListNode {
      next: None,
      val
    }
  }
}

impl Solution {
    pub fn swap_pairs(mut head: Option<Box<ListNode>>) -> Option<Box<ListNode>> {
        let mut dummy = Box::new(ListNode { val: 0, next: None });
        let mut cdummy = &mut dummy;
        while let Some(mut x) = head.take() {
            if x.next.is_none() {
                cdummy.next = Some(x);
                return dummy.next;
            }
            if let Some(mut y) = x.next.take() {
                head = y.next.take();
                y.next = Some(x);
                cdummy.next = Some(y);
                cdummy = cdummy.next.as_mut().unwrap();
                cdummy = cdummy.next.as_mut().unwrap();
            }
        }
        dummy.next
    }
}

}

学习感想

我发现我做链表逆序 两两交换的时候都是直接新建一个存返回链表的dummy头节点,然后按照操作来把节点从原来的链表里取出来插入新的链表中,根本不用想怎么修改指针