当前位置:   article > 正文

链表 经典面试题 OJ

链表 经典面试题 OJ

1. 删除链表中等于给定值 val 的所有节点。OJ链接

个人 解题思路:1.要删除这个节点就需要知道这个节点的前一个节点

                          2.把要删除节点的next值赋值给前一个节点的next

                          3.循环遍历链表判断

特殊情况:1.当head为null时,直接返回null即可。

                  2.遍历完成后需要再单独判断第一个节点是否是要删除的节点

代码如下:

  1. public ListNode removeElements(ListNode head, int val) {
  2. if(head == null)return null;
  3. //定义前一个节点
  4. ListNode pre = head;
  5. //要删除的节点
  6. ListNode cur = head.next;
  7. while(cur != null){ //这里注意 是从第二个节点开始判断的
  8. if(cur.val == val){
  9. pre.next = cur.next;
  10. cur = cur.next;
  11. }else{
  12. pre = pre.next;
  13. cur = cur.next;
  14. }
  15. }
  16. //这里需要再判断第一个元素是否是要删除的
  17. if(head.val == val){
  18. head = head.next;
  19. }
  20. return head;
  21. }

2.给定一个带有头结点 head 的非空单链表,返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。OJ链接

 个人解题思路:1. 定义两个指针,同时从链表头开始“走”。

                          2.快指针每次走两步,慢指针每次走一步。

                          3.当快指针走到链表最后一个节点时,满指针所在节点即为所求中间节点。

特殊情况:当链表节点为偶数个时,快指针会走到链表最后一个节点之后的null。

代码如下:

  1. public ListNode middleNode(ListNode head) {
  2. ListNode fast = head;
  3. ListNode slow = head;
  4. while(fast!=null&&fast.next!=null){ //需要注意节点个数为偶数的情况
  5. fast = fast.next.next;
  6. slow = slow.next;
  7. }
  8. return slow;
  9. }

3.判断链表是否回文 OJ链接

 个人解题思路:1.先找到链表的中间节点(方法同上)。

                          2.从中间节点开始翻转之后的链表。

                          3.定义两个指针分别从链表两边同时“走”,并判断val值是否相等。

注意: 两个指针同时走时循环的判断条件(当节点为偶数或者奇数个时)!

代码如下:

  1. public boolean chkPalindrome(ListNode head) {
  2. if(head == null){
  3. return false;
  4. }
  5. //1.先寻找链表的中间节点
  6. ListNode fast = head;
  7. ListNode slow = head;
  8. while(fast != null&&fast.next!=null){
  9. fast = fast.next.next;
  10. slow = slow.next;
  11. }
  12. //2.从slow开始翻转之后的链表
  13. ListNode cur = slow.next;
  14. while(cur!=null){
  15. ListNode curNext = cur.next;
  16. cur.next = slow;
  17. slow = cur;
  18. cur = curNext;
  19. }
  20. //3.从链表两端同时走
  21. //注意循环的判断条件
  22. while(head!=slow&&head.next!=slow){
  23. if(head.val != slow.val){
  24. return false;
  25. }
  26. head = head.next;
  27. slow = slow.next;
  28. }
  29. //这里head==slow 或者head.next==slow 使循环结束 分别判断
  30. if(head.next==slow){
  31. if(head.val == slow.val){
  32. return true;
  33. }else{
  34. return false;
  35. }
  36. }
  37. return true;
  38. }

希望大家可以指出其中的不足,分享自己更好的想法!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/569117
推荐阅读
相关标签
  

闽ICP备14008679号