赞
踩
题目: 给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。
什么是只进行节点交换,什么是值交换呢?
值交换:仅仅将链表中的val值进行交换
节点交换:是节点整个对象进行交换
学习 本节需要参考博主之前的关于节点创建的文章
一文读懂移除链表元素_abc123mma的博客-CSDN博客
一、链表节点交换
从LeetCode的题目中可以得出链表交换的交换也分为3部分
详细分析请参考:另一篇博文详解反转链表_abc123mma的博客-CSDN博客
基本分析如下:
首先设置cur结点指向虚拟头结点;为了方便表示这里的虚拟头节点省略了。
按照指定顺序操作链表
【1】表示cur节点指向2节点
【2】表示1节点指向3节点
【3】表示2节点指向1节点
【操作链表后】
【下一次循环前】:cur 要移动到节点1这个位置开始对节点3和4进行操作。
cur = cur.next.next;
【循环结束条件】:因为要保证两两交换,所以每次交换时候不能少于两个节点
因此结束条件为:
cur.next != null && cur.next.next != null
1.当节点数是偶数时,cur.next==null时,循环终止。
2.当节点数是奇数时,因为最后一个节点不用交换,所以当cur.next.next==null时,循环终止
- package link;
-
- import static link.ListNode.print;
-
- public class SwapLinkNode {
- public static void main(String[] args) {
- ListNode node1 = new ListNode(1);
- ListNode node2 = new ListNode(2);
- ListNode node3 = new ListNode(3);
- ListNode node4 = new ListNode(4);
- node1.next = node2;
- node2.next = node3;
- node3.next = node4;
- System.out.println("=========交换前=========");
- print(node1);
- ListNode node = swapPairs(node1);
- System.out.println("=========交换后=========");
- print(node);
- }
-
- public static ListNode swapPairs(ListNode head) {
- // 空节点
- if (head == null) {
- return null;
- }
- // 只有一个节点
- if (head.next == null) {
- return head;
- }
- ListNode dummy = new ListNode();
- dummy.next = head;
- ListNode cur = dummy;
- while (cur.next != null && cur.next.next != null) {
- ListNode temp = cur.next;
- // 步骤1
- cur.next = temp.next;
- // 步骤2
- ListNode temp2 = cur.next.next;
- cur.next.next = temp;
- // 步骤3
- temp.next = temp2;
- // 每次循环往后移动两个节点
- cur = cur.next.next;
- }
- return dummy.next;
- }
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。