/*反转链表,输出新链表的表头*/
public static ListNode ReverseList(ListNode head) {
if(head == null) return null;
ListNode node = head;
ListNode pre = null;
while(node != null){//当node的下一个节点为空的时候,意味着到了尾节点,但是返回的是pre,所以要先使pre = node,则为node!=null
ListNode next = node.next;//要先保存node的下一个节点才能让node指向前一个节点
if(next == null)
head = node;//当node的下一个节点为空的时候,保存新链表的表头
node.next = pre;//将node指向前一个节点
pre = node;//继续转下一个节点,pre+1,则前一个节点存为node
node = next;//当前节点继续加1
}
return head;
}
//【扩展】以k个反转链表,不足k个也反转
public static ListNode ReverseList_All_k(ListNode head, int k){
if (head == null)
return head;
ListNode cur = head;
ListNode pre = null;//前一个元素
int count = 0;
while (count < k && cur != null) {
ListNode reCur = cur;//保留当前的元素,为了能找到下一个元素
reCur.next = pre;
pre = reCur;//pre保留的是最后一个要操作的元素
cur = cur.next;
count++;
}
if (cur != null)
head.next = ReverseList_All_k(cur, k);
return pre;
}
//【扩展】以k个反转链表,不足k个不反转
public static ListNode ReverseList_buzu_k(ListNode head, int k){
if(head == null)
return head;
ListNode cur = head;
ListNode pre = null;
int count = 0;
if(getLength(cur)>=k){//判断当前链表长度
while(count < k && cur != null){
ListNode reCur = cur;
reCur.next = pre;
pre = reCur;
cur = cur.next;
count++;
}
if(cur != null)
head.next = ReverseList_buzu_k(cur, k);
return pre;
}
return cur;
}
public static int getLength(ListNode head){
ListNode node = head;
int count = 0;
while(node != null){
count++;
node = node.next;
}
return count;
}