1.反转链表
给定一个单链表的头结点pHead(该头节点是有值的,比如在下图,它的val是1),长度为n,反转该链表后,返回新链表的表头。
图解
代码实现
public ListNode ReverseList (ListNode head) {
ListNode cur = head;
ListNode pre = null;
ListNode next = null;
while(cur != null) {
next = cur.next;
cur.next = pre;
pre = cur;
cur = next;
}
return pre;
}
2.链表内指定区间反转
将一个节点数为 size 链表 m 位置到 n 位置之间的区间反转
输入:
{1,2,3,4,5},2,4
返回值:
{1,4,3,2,5}
输入:
{5},1,1
返回值:
{5}
图解
要翻转m 到 n 的节点 先将当前cur的下标转到m;
代码实现
public ListNode reverseBetween (ListNode head, int m, int n) {
ListNode res = new ListNode(-1);
res.next = head;
ListNode pre = res;
ListNode cur = pre.next;
for(int i = 0; i < m-1; i++) {
pre = cur;
cur = cur.next;
}
for(int i = m; i < n; i++) {
ListNode next = cur.next;
cur.next = next.next;
next.next = pre.next;
pre.next = next;
}
return res.next;
}
3.链表中的节点每k个一组翻转
将给出的链表中的节点每 k 个一组翻转,返回翻转后的链表
如果链表中的节点数不是 k 的倍数,将最后剩下的节点保持原样
你不能更改节点中的值,只能更改节点本身。
图解
代码实现
public ListNode reverseKGroup (ListNode head, int k) {
ListNode tail = head;
for(int i = 0; i < k; i++) {
if(tail == null) {
return head;
} else {
tail = tail.next;
}
}
ListNode pre = null;
ListNode cur = head;
while(cur != tail) {
ListNode next = cur.next;
cur.next = pre;
pre = cur;
cur = next;
}
head.next = reverseKGroup(tail,k);
return pre;
}