02.01. 移除重复节点
编写代码,移除未排序链表中的重复节点。保留最开始出现的节点。
示例1:
输入:[1, 2, 3, 3, 2, 1]
输出:[1, 2, 3]
示例2:
输入:[1, 1, 1, 1, 2]
输出:[1, 2]
提示:
链表长度在[0, 20000]范围内。 链表元素在[0, 20000]范围内。
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */ class Solution { public ListNode removeDuplicateNodes(ListNode head) { if(head==null||head.next==null) return head; ListNode p=head,q=head.next; Set<Integer> set=new HashSet<Integer>(); set.add(p.val); while(q!=null) { if(!set.contains(q.val)) { p.next=q; p=p.next; set.add(q.val); } q=q.next; } p.next=null; return head; } }
个人总结: 要勤练。
02.02. 返回倒数第 k 个节点
实现一种算法,找出单向链表中倒数第 k 个节点。返回该节点的值。
注意:本题相对原题稍作改动
示例:
输入: 1->2->3->4->5 和 k = 2
输出: 4
说明:
给定的 k 保证是有效的。
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */ class Solution { public int kthToLast(ListNode head, int k) { ListNode p=head,q=head; int c=0; while(c<k-1) { q=q.next; c++; } while(q.next!=null) { p=p.next; q=q.next; } return p.val; } }
个人总结: 下次可以尝试一下递归。