标签:头结点 题目 tno 执行 推导 传递 node || header
给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
示例:
给定 1->2->3->4, 你应该返回 2->1->4->3.
链表可以创建一个头结点来辅助解题,再创建一个指针指向头结点(该指针是把链表连起来用的),然后按照1指向3、2指向1完成交换,指针也下移两位,一直循环,直到刚好交换完或者剩下一个结点时候结束循环,完成交换
class Solution {
public ListNode swapPairs(ListNode head) {
//链表一般可以考虑创建一个头结点来辅助解题
ListNode newHead = new ListNode(-1);
ListNode cur = newHead;
//将头指针指向下一个要排序的head
cur.next = head;
//刚好交换完或者剩下一个结点时候结束循环
while (head != null && head.next != null) {
//改变指针指向交换后的左结点
cur.next = head.next;
//进行交换
head.next = head.next.next;
cur.next.next = head;
//两个指针都移动后两位
cur = head;
head = head.next;
}
//返回第一个结点
return newHead.next;
}
}
递归实现,下一次递归传递的是要交换的第一个结点,若还有结点,就继续递归。我们可以从后往前看,将交换完的链表返回给前一个调用该函数的他的next,然后依次推导,最后返回头结点(注意,返回的要是第二个结点,因为第一个结点和第二个结点交换完后第二个就变成了第一个结点了)
class Solution {
public ListNode swapPairs(ListNode head) {
//刚好交换完或者剩下一个结点时候结束递归
if (head == null || head.next == null) {
return head;
}
//用来记录第二个结点的
ListNode p1 = head.next;
//第一个结点的下一个为交换好后的链表
head.next = swapPairs(p1.next);
//必须要放到执行swapPairs函数后面执行,否则如果先执行,那么函数里面的p1.next就指错了,造成栈溢出
p1.next = head;
return p1;
}
}
标签:头结点 题目 tno 执行 推导 传递 node || header
原文地址:https://www.cnblogs.com/linzedian/p/13763596.html