标签:head ListNode next 链表 l2 关于 l1 操作 null
1、寻找链表的中点
// 找到链表的中点(快慢指针) public ListNode getMidNode(ListNode head) { ListNode slow = head; ListNode fast = head; while (fast.next != null && fast.next.next != null) { slow = slow.next; fast = fast.next.next; } return slow; }
2、翻转链表
// 翻转链表 public ListNode reverse(ListNode head) { ListNode prev = null; ListNode curr = head; while(curr != null) { ListNode node = curr.next; curr.next = prev; prev = curr; curr = node; } return prev; }
3、合并链表
// 合并链表 public void merge(ListNode l1, ListNode l2) { ListNode l1_tmp; ListNode l2_tmp; while (l1 != null && l2 != null) { l1_tmp = l1.next; l2_tmp = l2.next; l1.next = l2; l1 = l1_tmp; l2.next = l1; l2 = l2_tmp; } }
综合例子143-重排链表
class Solution { public void reorderList(ListNode head) { if (head == null || head.next == null) return ; // 找到链表的中点 ListNode node = getMidNode(head); ListNode head1 = node.next; node.next = null; // 将左右两部分断开 // 翻转链表 head1 = reverse(head1); // 合并 merge(head, head1); } // 找到链表的中点(快慢指针) public ListNode getMidNode(ListNode head) { ListNode slow = head; ListNode fast = head; while (fast.next != null && fast.next.next != null) { slow = slow.next; fast = fast.next.next; } return slow; } // 翻转链表 public ListNode reverse(ListNode head) { ListNode prev = null; ListNode curr = head; while(curr != null) { ListNode node = curr.next; curr.next = prev; prev = curr; curr = node; } return prev; } // 合并链表 public void merge(ListNode l1, ListNode l2) { ListNode l1_tmp; ListNode l2_tmp; while (l1 != null && l2 != null) { l1_tmp = l1.next; l2_tmp = l2.next; l1.next = l2; l1 = l1_tmp; l2.next = l1; l2 = l2_tmp; } } }
标签:head,ListNode,next,链表,l2,关于,l1,操作,null 来源: https://www.cnblogs.com/xiazhenbin/p/15532263.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。