408算法练习——两两交换链表中结点

两两交换链表中结点

问题链接https://leetcode-cn.com/problems/swap-nodes-in-pairs/submissions/

一、问题描述

给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。

你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。

408算法练习——两两交换链表中结点

 

   

输入:head = [1,2,3,4]
输出:[2,1,4,3]
示例 2:

输入:head = []
输出:[]
示例 3:

输入:head = [1]
输出:[1]

 

二、算法描述

  只需要两个指针,两两向后遍历,然后依次交换指针结点即可,注意维持链表的链接,所以还需要一个前指针,这个题的链表没有头节点,可以自己编一个头节点给题目,注意当链表中有奇数个元素时的处理

代码:

  

 1 /**
 2  * Definition for singly-linked list.
 3  * public class ListNode {
 4  *     int val;
 5  *     ListNode next;
 6  *     ListNode() {}
 7  *     ListNode(int val) { this.val = val; }
 8  *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 9  * }
10  */
11 class Solution {
12     public ListNode swapPairs(ListNode head) {
13         if(head == null){
14             return head;
15         }
16         ListNode nhead = new ListNode();
17         nhead.next = head;//创建一个头节点方便操作
18         ListNode r = nhead;//定义r,每次都交换r后的两个结点
19         while(r.next != null){
20             ListNode i = r.next;//r后的第一个结点
21             if(i.next == null){//如果r后只有一个结点,就该跳出循环
22                 break;
23             }
24             ListNode j = i.next;
25             i.next = j.next;//交换操作
26             r.next = j;
27             j.next = i;
28             r = i;//因为r后第一个结点被换到后面了,所以新的r就是这组结点最后的那个
29         }
30         return nhead.next;
31     }
32 }

 

上一篇:计算机考研408每日题目 0x08


下一篇:408算法练习——搜索二维矩阵