1. 反转链表
public class ReverseList92 {
//定义一个单链表
public class ListNode {
int val; //当前节点值
ListNode next; //下一个节点值
//构造方法 初始化当前节点值
ListNode(int x) { val = x; }
}
/**反转链表(反转链表中一部分)
*方法1:迭代思想(利用链表特性)
* @param head 要处理的链表
* @param m 要反转的头节点
* @param n 要反转的尾节点
* @return
*/
public ListNode reverseBetween(ListNode head, int m, int n) {
ListNode res = new ListNode(0);
res.next = head;
ListNode node = res;
//找到需要反转的那一段的上一个节点。
for (int i = 1; i < m; i++) {
node = node.next;
}
//node.next就是需要反转的这段的起点。
ListNode nextHead = node.next;
ListNode next = null;
ListNode pre = null;
//反转m到n这一段
for (int i = m; i <= n; i++) {
next = nextHead.next;
nextHead.next = pre;
pre = nextHead;
nextHead = next;
}
//将反转的起点的next指向next。
node.next.next = next;
//需要反转的那一段的上一个节点的next节点指向反转后链表的头结点
node.next = pre;
return res.next;
}
//如何递归地反转链表的一部分
//方法2:递归 没看懂
}
方法1图解:
2. LeetCode代码测试