2020/09/18
问题1:从尾到头打印链表
链表来反转即可:
//从尾到头打印链表
public static int [] reversePrint(ListNode head){
if(head == null) return null;
int countlength =0;
ListNode conNode = head;
while (conNode != null){
countlength++;
conNode = conNode.next;
}
int nodes[] = new int[countlength];
while (head != null){
nodes[--countlength] = head.val;
head = head.next;
}
return nodes;
}
问题2:移除未排序链表中重复节点,保留最开始出现的节点
解法1:使用临时缓冲区,set去重
//一般想到去重,首先就想到set去重,是一个临时缓冲区的形式
public static ListNode removeNodes(ListNode head){
HashSet<Integer> set = new LinkedHashSet<>();
ListNode cur = head;
while (cur != null && cur.next != null){
set.add(cur.val);
if(set.contains(cur.next.val))
cur.next = cur.next.next;
else
cur = cur.next;
}
return head;
}
解法二:使用双指针,不需要额外空间
//不使用额外空间,可以使用双指针实现,采用两层while循环
public static ListNode removeNodes2(ListNode head){
if(head == null) return null;
while (head != null){
ListNode node = head.next;
while (node != null && node.next != null){
//寻找相同节点的上一个节点
if(head.val == node.next.val){
node.next = node.next.next;
}
node = node.next;
}
head = head.next;
}
return head;
}