leetcode143 重排链表

举报
兔老大 发表于 2021/04/20 00:24:45 2021/04/20
【摘要】 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。 示例 1: 给定链表 1->2->3->4, 重新排列为 1->4->2->3. 示例 2: 给定链表 1->2->3->4->5, 重新排列为 1->5->2->4->3. 思路:分成两个链表,第二个逆置,...

你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。

示例 1:

给定链表 1->2->3->4, 重新排列为 1->4->2->3.
示例 2:

给定链表 1->2->3->4->5, 重新排列为 1->5->2->4->3.

思路:分成两个链表,第二个逆置,然后插入即可。


  
  1. /**
  2. * Definition for singly-linked list.
  3. * public class ListNode {
  4. * int val;
  5. * ListNode next;
  6. * ListNode(int x) { val = x; }
  7. * }
  8. */
  9. public void reorderList(ListNode head) {
  10. if (head == null || head.next == null || head.next.next == null) {
  11. return;
  12. }
  13. //找中点,链表分成两个
  14. ListNode slow = head;
  15. ListNode fast = head;
  16. while (fast.next != null && fast.next.next != null) {
  17. slow = slow.next;
  18. fast = fast.next.next;
  19. }
  20. ListNode newHead = slow.next;
  21. slow.next = null;
  22. //第二个链表倒置
  23. newHead = reverseList(newHead);
  24. //链表节点依次连接
  25. while (newHead != null) {
  26. ListNode temp = newHead.next;
  27. newHead.next = head.next;
  28. head.next = newHead;
  29. head = newHead.next;
  30. newHead = temp;
  31. }
  32. }
  33. private ListNode reverseList(ListNode head) {
  34. if (head == null) {
  35. return null;
  36. }
  37. ListNode tail = head;
  38. head = head.next;
  39. tail.next = null;
  40. while (head != null) {
  41. ListNode temp = head.next;
  42. head.next = tail;
  43. tail = head;
  44. head = temp;
  45. }
  46. return tail;
  47. }

文章来源: fantianzuo.blog.csdn.net,作者:兔老大RabbitMQ,版权归原作者所有,如需转载,请联系作者。

原文链接:fantianzuo.blog.csdn.net/article/details/103405381

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。