当前位置:   article > 正文

判断链表是否为回文链表的几种实现方式学习总结_判断链表是否为回文串

判断链表是否为回文串

示例:如果一个链表为 1 -> 2 -> 3 -> 2 -> 1;

它的正序遍历结果等于它的倒序遍历结果,那么它就是回文链表;

第一种实现: 判断一个链表是不是回文链表的第一种实现,使用一个栈、并遍历两次链表 第一遍遍历将链表的元素添加至栈中,第二遍遍历的过程中依次弹出栈中的元素进行比较。时间复杂度:O(N);空间复杂度:O(N);

代码实现:

  1. public class isHuiWenListNodeFirst {
  2. public static void main(String[] args) {
  3. Scanner sc= new Scanner(System.in);
  4. int n = sc.nextInt(); //链表的节点的个数
  5. ListNode head = new ListNode(sc.nextInt());
  6. ListNode pre = head;
  7. while (n>1){
  8. n--;
  9. pre.next = new ListNode(sc.nextInt());
  10. pre = pre.next;
  11. }
  12. System.out.println(isOrNot(head));
  13. }
  14. public static boolean isOrNot(ListNode head){
  15. ListNode pre = head;
  16. LinkedList<Integer> stack = new LinkedList<>();
  17. while(pre!=null){
  18. stack.push(pre.val);
  19. pre = pre.next;
  20. }
  21. while(!stack.isEmpty()){
  22. if(head.val != stack.poll()) return false;
  23. head = head.next;
  24. }
  25. return true;
  26. }
  27. }

测试结果正确;(未作head是否为空的判断处理)

方法二:在方法一的基础上进行剪枝操作。双指针,慢指针每次移动一个位置,快指针每次移动两个位置。当快指针走到链表的中点时,慢指针指向的位置就是中间的位置;时间复杂度:O(N);空间复杂度:O(N);

代码实现:

  1. public class isHuiWenListNodeFirst {
  2. public static void main(String[] args) {
  3. Scanner sc= new Scanner(System.in);
  4. int n = sc.nextInt(); //链表的节点的个数
  5. ListNode head = new ListNode(sc.nextInt());
  6. ListNode pre = head;
  7. while (n>1){
  8. n--;
  9. pre.next = new ListNode(sc.nextInt());
  10. pre = pre.next;
  11. }
  12. System.out.println(isOrNot(head));
  13. }
  14. public static boolean isOrNot(ListNode head){
  15. if (head == null || head.next == null) return true;
  16. ListNode pre = head;
  17. LinkedList<Integer> stack = new LinkedList<>();
  18. ListNode slow = head; //慢指针
  19. ListNode fast = head; //快指针
  20. while(fast.next!=null && fast.next.next!=null){
  21. slow = slow.next;
  22. fast = fast.next.next;
  23. }
  24. //此时开始遍历 slow 指针,依次将其遍历到的元素添加至栈中
  25. while(slow!=null){
  26. stack.push(slow.val);
  27. slow = slow.next;
  28. }
  29. //开始遍历链表的前一半,并弹出栈中的元素做比较
  30. while(!stack.isEmpty()){
  31. Integer poll = stack.poll();
  32. if(pre.val!=poll){
  33. return false;
  34. }
  35. pre = pre.next;
  36. }
  37. return true;
  38. }
  39. }

分别测试链表节点个数为奇数和偶数的情况:

测试结果正确(可能包含没有考虑到的其他情况,望指正)

方法三:仍然使用快慢指针,与方法二不同的地方:当慢指针走到中点时,快指针走到末尾。此时记录下来快指针的位置的节点。快指针开始向后遍历反转后半部分的链表,反转结束之后,使用双指针,left 指针指向链表的第一个节点。right 指针指向链表最右侧的节点,left 指针从前往后遍历,right 指针从后向前遍历,依次比较两个指针指向的元素,如果不相等返回 false 。时间复杂度:O(N);空间复杂度:O(1);没有使用额外的空间。

代码实现:

  1. public class isHuiWenListNodeFirst {
  2. public static void main(String[] args) {
  3. Scanner sc= new Scanner(System.in);
  4. int n = sc.nextInt(); //链表的节点的个数
  5. ListNode head = new ListNode(sc.nextInt());
  6. ListNode pre = head;
  7. while (n>1){
  8. n--;
  9. pre.next = new ListNode(sc.nextInt());
  10. pre = pre.next;
  11. }
  12. System.out.println(isOrNot(head));
  13. }
  14. public static boolean isOrNot(ListNode head){
  15. //先将特殊情况做处理;
  16. if (head == null || head.next == null) return true;
  17. if (head.next!=null&&head.next.next==null&&head.val==head.next.val) return true;
  18. ListNode left = head;
  19. ListNode right;
  20. ListNode slow = head;
  21. ListNode fast = head;
  22. //如果节点个数是奇数,那么fast最终指向的位置是最后一个节点
  23. //如果节点个数是偶数,那么fast指向的位置是最后一个节点的前一个元素,此时还需要让fast后移一位
  24. while(fast.next!=null && fast.next.next!=null){
  25. slow = slow.next;
  26. fast = fast.next.next;
  27. if(fast.next!=null && fast.next.next==null) fast = fast.next;
  28. }
  29. //记录下来末尾节点
  30. //开始反转链表,反转 slow 之后的节点
  31. right = slow.next;
  32. ListNode tmp = right.next;
  33. slow.next = null;
  34. right.next = slow;
  35. slow = right;
  36. right = tmp;
  37. //循环结束之后,right为null,slow指向最后一个节点,至此后半部分的链表反转完成
  38. while(right!=null){
  39. tmp = right.next;
  40. right.next = slow;
  41. slow = right;
  42. right = tmp;
  43. }
  44. right = slow;
  45. //开始比较元素的值
  46. while(left!=null){
  47. if(left.val!= right.val) return false;
  48. left = left.next;
  49. right = right.next;
  50. }
  51. return true;
  52. }
  53. }

测试结果(可能包含没有考虑到的其他情况,望指正):

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号