首页 > 代码库 > 单链表反转问题
单链表反转问题
单链表反转问题
基本问题
如何将单链表反转?
算法实现
/**
*
* Description: 单链表反转.
*
* @param head
* @return ListNode
*/
public static ListNode reverseList(ListNode head) {
if (head == null) {
return head;
}
ListNode prev = null;
ListNode current = head;
ListNode next = null;
while (current != null) {
next = current.next;
current.next = prev;
prev = current;
current = next;
}
head = prev;
return head;
}
进阶问题
如何 将单链表在指定区间内进行反转?
问题分析
这个问题是上面问题的一个变形,难度也加大了不少,主要的难点之处就在于对边界条件的检查。
实现思路,主要就是按照给定的区间得到需要整体反转的一个子链表然后进行反转,最后就是把链表按正确的顺序拼接在一起。
算法实现
/**
*
* Description: 单链表反转,反转指定区间内的节点.
*
* @param head
* @param m
* @param n
* @return ListNode
*/
public static ListNode reverseBetween(ListNode head, int m, int n) {
// 合法性检测
if (head == null || m >= n || m < 1 || n < 1) {
return head;
}
/**
* 将链表按[m,n]区间分成三段.
*
* first,second,third分别为每一段的头节点(注意,m=1也就是first与second相等的情况的处理)
* first-->firstTail
* second
* third
*/
ListNode first = head;
ListNode firstTail = first;
ListNode second = first;
ListNode third = first;
ListNode current = first;
int i = 0;
while (current != null) {
i++;
if (i == m - 1) {
firstTail = current;
}
if (i == m) {
second = current;
}
if (i == n) {
third = current.next;
break;
}
current = current.next;
}
// 进行中间second段的reverse
current = second;
ListNode prev = third;
ListNode next = null;
while (current != third) {
next = current.next;
current.next = prev;
prev = current;
current = next;
}
if (m == 1) {
first = prev;
} else {
firstTail.next = prev;
}
return first;
}
来自为知笔记(Wiz)
单链表反转问题
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。