2020-08-28

链表反转

import java.util.Scanner;
class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}
public class lianbiao {
	//*************************************************************
	public static ListNode builderHelper(ListNode pNode,int num) {
		if(pNode==null) {
			return new ListNode(num);
		}
		pNode.next=builderHelper(pNode.next,num);
		return pNode;
	}
	public static ListNode builder(int[] nums) {
		ListNode head = null;
		for(int num:nums) {
			if(head==null) {
				head = new ListNode(num);
				continue;
			}
			builderHelper(head,num);
		}
		return head;
	}
	//*************************************************************
	//倒数第k个
	public static ListNode kNode(ListNode head,int k) {
		ListNode p1=head;
		ListNode p2=head;
		while(k-->0) {
			p2=p2.next;
		}
		while(p2!=null) {
			p1=p1.next;
			p2=p2.next;
		}
		return p1;
	}
	//反转整个链表
	public static ListNode reverse(ListNode head) {
		if(head.next==null) return head;
		ListNode last = reverse(head.next);
		head.next.next=head;
		head.next=null;
		return last;
	}
	//反转前n个
	public static ListNode successor = null;
	public static ListNode reverseN(ListNode head, int n) {
		if(n==1) {
			successor = head.next;
			return head;
		}
		ListNode last =  reverseN(head.next,n-1);
		head.next.next=head;
		head.next=successor;
		return last;
		
	} 
	//反转m到n
	public static ListNode reverseMN(ListNode head, int m, int n) {
		if(m==1) {
			return reverseN(head, n);
		}
		head.next=reverseMN(head.next,m-1,n-1);
		return head;
	}
	
	public static void main(String[] args) {
		Scanner in=new Scanner(System.in);
		while(in.hasNext()) {
			String[] str = in.nextLine().split(" ");
			int k = Integer.parseInt(in.nextLine());
			int[] nums = new int[str.length];
			int i=0;
			for(String s:str) {
				nums[i++]=Integer.parseInt(s);
			}
			ListNode node = builder(nums);
//			ListNode allnode= reverse(node);
//			ListNode knode= kNode(node,k);
//			ListNode knode= reverseN(node,k);
			ListNode mnnode= reverseMN(node,2,4);
			while(mnnode!=null) {
			System.out.print(mnnode.val +" ");
			mnnode=mnnode.next;
			}
		}
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值