题目描述
给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
示例:
给定 1->2->3->4, 你应该返回 2->1->4->3.
解法一:
节点交换思路
复杂度分析:
时间复杂度:O(N),其中 N 指的是链表的节点数量。
空间复杂度:O(1)。
代码示例:
public class Test {
public static void main(String[] args) {
//初始化node链表
Node node = initNode();
//打印信息
printValueList(node, "【初始node】");
//交换
node = swapNode(node);
//打印信息
printValueList(node, "【交换结束】");
}
private static Node swapNode(Node node) {
//定义起始空节点
Node headNode = new Node(-1);
headNode.next = node;
Node preNode = headNode;
while (node != null && node.next != null){
//记录需要交换的节点
Node firstNode = node;
Node secondNode = node.next;
//交换
preNode.next = secondNode;
secondNode.next = firstNode;
firstNode.next = secondNode.next;
//更新node【未交换的剩余链表】和preNode【剩余链表的前驱节点】
node = firstNode.next;
preNode = firstNode;
}
return headNode.next;
}
//打印
private static void printValueList(Node node,String num) {
List<Integer> numList = new ArrayList<>();
while (node != null){
numList.add(node.value);
node = node.next;
}
System.out.println("第"+num+"条链表的value集合为:"+numList);
}
private static Node initNode() {
Node node = new Node(10);
for (int i=9; i>0; i--){
Node nodeTemp = new Node(i);
nodeTemp.next = node;
node = nodeTemp;
}
return node;
}
}
//Node节点
class Node{
public Integer value;
public Node next;
public Node(Integer value) {
this.value = value;
}
@Override
public String toString() {
return "Node{" +
"value=" + value +
", next=" + next +
'}';
}
}
解法二:
复杂度分析:
时间复杂度:O(N),其中 N 指的是链表的节点数量。
空间复杂度:O(N),递归过程使用的堆栈空间。
代码示例:
public class Test {
public static void main(String[] args) {
//初始化node链表
Node node = initNode();
//打印信息
printValueList(node, "【初始node】");
//交换
node = swapNode(node);
//打印信息
printValueList(node, "【交换结束】");
}
private static Node swapNode(Node node) {
if (node == null || node.next == null){
return node;
}
//记录需要交换的两个节点
Node firstNode = node;
Node secondNode = node.next;
//交换
firstNode.next = swapNode(secondNode.next);
secondNode.next = firstNode;
return secondNode;
}
private static void printValueList(Node node,String num) {
List<Integer> numList = new ArrayList<>();
while (node != null){
numList.add(node.value);
node = node.next;
}
System.out.println("第"+num+"条链表的value集合为:"+numList);
}
private static Node initNode() {
Node node = new Node(10);
for (int i=9; i>0; i--){
Node nodeTemp = new Node(i);
nodeTemp.next = node;
node = nodeTemp;
}
return node;
}
}
//Node节点
class Node{
public Integer value;
public Node next;
public Node(Integer value) {
this.value = value;
}
@Override
public String toString() {
return "Node{" +
"value=" + value +
", next=" + next +
'}';
}
}
运行结果
leetcode题目链接
▄█▀█●各位同仁,如果我的代码对你有帮助,请给我一个赞吧,为了下次方便找到,也可关注加收藏呀
如果有什么意见或建议,也可留言区讨论