【Leetcode】(java)两两交换链表中的节点
(ps:这一段时间在写论文,终于搞得差不多了,之后会更新一些在论文实验和论文撰写方面踩到的一些坑!)
解题思路主要利用数组(不算聪明的办法,但是思路比较清晰)
首先我为什么要用数组呢?
因为数组要比链表好操作,这是大学数据结构课程中学的,数组最大的优点就是对原始元素的处理,包括修改,迅速找到位置等,链表与之相比的优点是可以随意添加和删除元素(时间复杂度低),但是想修改任意地方的值就比较麻烦。
话不多说上代码:
public class ListNode {
int val;
ListNode next;
ListNode() {}
ListNode(int val) { this.val = val; }
ListNode(int val, ListNode next) { this.val = val; this.next = next; }
}
public ListNode swapPairs(ListNode head) {
/*两两交换链表的结点*/
if(head==null){
return null;
}
ArrayList<Integer> arr = new ArrayList<>();
ListNode z = head;
// 链表元素全部放入连续数组中
while(z!=null){
arr.add(z.val);
z = z.next;
}
Integer temp; // 用于临时存储交换时候第一个被修改的变量
int len = arr.size(); //数组长度
int times = len/2; // 交换的次数
// 如果只有一个元素,则返回唯一值
if(len==1){
return new ListNode(arr.get(0));
}
// 当数组长度大于1的时候
int start = 0;
for(int i=0; i<times; i++){ // 需要交换times次
temp = arr.get(start);
// 0的位置放上1,1的位置放上0
arr.set(start, arr.get(start+1));
arr.set(start+1,temp);
// 每交换一次向右移动两个单位再继续交换
start += 2;
}
// 最后将数组转换成链表返回
ListNode new_node = new ListNode();
ListNode new_z = new_node;
for (int i=0; i<arr.size(); i++){
new_z.next = new ListNode(arr.get(i));
new_z = new_z.next;
}
return new_node.next;
}
版权声明:本文为qq_41761265原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。