leecode--单链表移除链表元素,奇偶链表

六月ゝ 毕业季﹏ 提交于 2020-03-25 20:42:28

3 月,跳不动了?>>>

移除链表元素

删除链表中等于给定值val的所有节点

示例:

输入: 1->2->6->3->4->5->6, val = 6
输出: 1->2->3->4->5

此问题想着很简单,删除元素必须用到两个节点,一个节点cur用于遍历链表,另一个节点pre表示当前节点的前一个节点。但是还需要注意以下问题:

  • 1)如果需要删除的是链表的头节点该如何处理?
  • 2)如果需要删除的节点是链表中的所有节点如何处理?
  • 3)pre节点和cur节点如何遍历?
  1. 一个链表的初始情况:
  2. 需要删除的节点是2,第二步节点情况应该是 可以看出上述情况下,pre节点不用移动,而cur节点移向next即可
  3. 如果删除的节点是3,第二步的节点情况应该是 此种情况下,pre节点只想cur,而cur指向本身的next

上述三种情况都处理完成后,则可以轻松写出如下代码。

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
   public ListNode removeElements(ListNode head, int val) {
        if (null == head) {
            return head;
        }
	   //删除头节点
        while (null != head && head.val == val) {
            if (null != head.next) {
                head = head.next;
            } else {
                head = null;
            }
        }
        if (null == head) {
            return head;
        }
        ListNode pre = head;
        ListNode cur = head.next;
        while (null != cur) {
            if (cur.val == val) {
                pre.next = cur.next;               
            } else {
                pre = cur;
            }
			cur = cur.next;
        }
        return head;
    }
}

奇偶链表

给定一个单链表,把所有的奇数节点和偶数节点分别排在一起。请注意,这里的奇数节点和偶数节点指的是节点编号的奇偶性,而不是节点的值的奇偶性。

请尝试使用原地算法完成。你的算法的空间复杂度应为 O(1),时间复杂度应为 O(nodes),nodes 为节点总数。

示例 1:
输入: 1->2->3->4->5->NULL
输出: 1->3->5->2->4->NULL

示例 2:
输入: 2->1->3->5->6->4->7->NULL 
输出: 2->3->6->7->1->5->4->NULL

写完代码后,看了下leecode官网的解答,感觉思路很清晰。就用官网的解答了。

作者:LeetCode 链接:https://leetcode-cn.com/problems/odd-even-linked-list/solution/qi-ou-lian-biao-by-leetcode/ 来源:力扣(LeetCode)

想法

将奇节点放在一个链表里,偶链表放在另一个链表里。然后把偶链表接在奇链表的尾部

算法

这个解法非常符合直觉思路也很简单。但是要写一个精确且没有 bug 的代码还是需要进行一番思索的。 一个 LinkedList 需要一个头指针和一个尾指针来支持双端操作。我们用变量 head 和 odd 保存奇链表的头和尾指针。 evenHead 和 even 保存偶链表的头和尾指针。算法会遍历原链表一次并把奇节点放到奇链表里去、偶节点放到偶链表里去。遍历整个链表我们至少需要一个指针作为迭代器。这里 odd 指针和 even 指针不仅仅是尾指针,也可以扮演原链表迭代器的角色。 这个解法非常符合直觉思路也很简单。但是要写一个精确且没有 bug 的代码还是需要进行一番思索的。

代码
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode oddEvenList(ListNode head) {
        if(null == head || null == head.next){
            return head;
        }
        ListNode oddHead = head;
        ListNode evenHead = head.next;
        ListNode temp = evenHead;
        while(null != evenHead && null != evenHead.next){
            oddHead.next = evenHead.next;
            oddHead = oddHead.next;
            evenHead.next = oddHead.next;
            evenHead = evenHead.next;
        }
        oddHead.next = temp;
        return head;        
    }
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!