publicLinkedNodereverse(LinkedNode head){LinkedNode vhead =newLinkedNode(-1);
vhead.next = head;LinkedNode current = head;while(current!=null){LinkedNode next = current.next;
current.next = vhead.next;
vhead.next = current;
current = next;}return vhead.next;}
publicstaticLinkedNodereverse2(LinkedNode head){LinkedNode pre =null;LinkedNode current = head;while(current!=null){LinkedNode next = current.next;
current.next = pre;
pre = current;
current = next;}return pre;}
publicListNodeplusOne(ListNode head){
head =reverse(head);ListNode current = head;int flag =0;do{
current.val +=1;
flag = current.val /10;
current.val %=10;
current = current.next;}while(flag ==1&& current !=null);
head =reverse(head);if(flag ==1){ListNode node =newListNode(1);
node.next = head;
head = node;}return head;}publicListNodereverse(ListNode head){ListNode pre =null;ListNode current = head;while(current !=null){ListNode next = current.next;
current.next = pre;
pre = current;
current = next;}return pre;}
链表加法
publicListNodeaddTwoNumbers(ListNode l1,ListNode l2){ListNode r1 =reverse(l1);ListNode r2 =reverse(l2);ListNode vhead =newListNode(-1);ListNode current = vhead;int flag =0;while(r1!=null||r2!=null||flag==1){int a = r1==null?0:r1.val;int b = r2==null?0:r2.val;int sum = a+b+flag;
flag = sum/10;
sum%=10;ListNode node =newListNode(sum);
current.next = node;
current = node;if(r1!=null){
r1=r1.next;}if(r2!=null){
r2=r2.next;}}returnreverse(vhead.next);}publicListNodereverse(ListNode head){ListNode pre =null;ListNode current = head;while(current!=null){ListNode next = current.next;
current.next = pre;
pre = current;
current = next;}return pre;}
判断链表是否有环
publicbooleanhasCycle(ListNode head){ListNode fast = head;ListNode slow = head;while(fast!=null&&fast.next!=null){
fast = fast.next.next;
slow = slow.next;if(fast==slow){returntrue;}}returnfalse;}
带环链表环的入口
publicListNodedetectCycle(ListNode head){ListNode slow = head;ListNode fast = head;while(fast!=null&&fast.next!=null){
fast=fast.next.next;
slow = slow.next;if(fast==slow){break;}}if(fast==null||fast.next==null){returnnull;}
fast = head;while(fast!=slow){
fast = fast.next;
slow = slow.next;}return slow;}
K个一组反转链表
publicListNodereverseKGroup(ListNode head,int k){//简化计算,先遍历获取链表长度int len =getLength(head);//计算需要反转的次数int n = len/k;//简历虚拟头节点ListNode vhead =newListNode(-1);//current指向每次头插法插入的头节点ListNode current = vhead;//iter用于遍历给定链表ListNode iter = head;//n次反转for(int i=0;i<n;i++){//k个一组反转for(int j=0;j<k;j++){//记录需要遍历的下一个节点ListNode next = iter.next;//头插法进行节点插入
iter.next = current.next;
current.next = iter;//继续遍历
iter = next;}//将current指向当前的最后一个节点,也是下次头插法的头节点for(int l=0;l<k;l++){
current = current.next;}}//不足k个,直接拼接if(iter!=null){
current.next = iter;}//返回k个一组反转后的链表return vhead.next;}
publicListNodereverseKGroup(ListNode head,int k){//为了方便插入,简历虚拟头节点ListNode vhead =newListNode(-1);//pre指向拼接时的前一个节点ListNode pre = vhead;//计算反转次数int n =getLength(head)/k;//current用于遍历给定链表ListNode current = head;//n次反转for(int i=0;i<n;i++){//left指向反转前的第一个元素ListNode left = current;//找到当前的第K个元素for(int j=0;j<k-1;j++){
current = current.next;}//right指向反转前的最后一个元素ListNode right = current;//post指向拼接时的后一个节点ListNode post = current.next;//right必须置空,否则后面的元素会一起反转
right.next =null;//反转
right =reverse(left);//拼接
pre.next = right;
left.next = post;//下次拼接时的前一个节点变成left
pre = left;//下一次反转从post开始计数
current = post;}//最后不足K个,直接拼接if(current!=null){
pre.next = current;}//返回反转结果return vhead.next;}