链表反转
单链表反转
leetcode 206 reverse-linked-list
- 递归解法
class Solution {
public ListNode reverseList(ListNode head) {
if(head==null || head.next==null){
return head;
}
ListNode fakehead = reverseList(head.next);
head.next.next = head;
head.next = null;
return fakehead;
}
}
- 迭代解法
class Solution {
public ListNode reverseList(ListNode head) {
if(head==null || head.next==null){
return head;
}
ListNode pre = null;
ListNode next = null;
while(head!=null){
next = head.next;
head.next = pre;
pre = head;
head = next;
}
return pre;
}
}
链表部分翻转(从第m个至第n个)
leetcode 92 reverse-linked-list-ii
参考:https://blog.csdn.net/weixin_41055558/article/details/91356599
定义三个指针:
cur, curNext, curPre
public ListNode reverse(ListNode head, int m, int n){
ListNode prehead = new ListNode(0);
prehead.next = head;
ListNode cur = prehead;
for(int i=0; i<m-1; i++){
cur = cur.next;
}//找到第m-1个节点
ListNode curpre = cur;
cur = cur.next;
ListNode curnext = null;
for(int i=0; i<n-m; i++){
//头插法
curnext = cur.next;
cur.next = curnext.next;
curnext.next = curpre.next;
curpre.next = curnext;
}
return prehead.next;
}
每K个节点反转
leetcode 25 reverse-nodes-in-k-group
class Solution {
public ListNode reverseKGroup(ListNode head, int k) {
if(head==null || k==1 || head.next==null){
return head;
}
ListNode cur = head;
int len=0;
while(cur!=null){
len++;
cur=cur.next;
}
if(k>len){
return head;
}
cur = head;
ListNode pre = new ListNode(0);
for(int i=0; i<k; i++){
ListNode next = cur.next;
cur.next = pre;
pre = cur;
cur = next;
}
head.next = reverseKGroup(cur,k);
return pre;
}
}