算法和数据结构面试题(16)-单链表倒置
2014-12-29 21:59
225 查看
题目
链表操作 (1)单链表就地逆置
解题思路
关于单链表1.创建单链表,需要首先写一个单链表的类。
模仿LinkedList写一个SingleLinkedList类。
/** * Copyright 2014 TJ SPREADTRUM TEST_AF All Right Reserved * * @author: hui.qian Created on 2014年12月29日 下午4:55:41 Description: * @param <E> */ public class SingleLinkedList<E> extends AbstractSequentialList<E> implements List<E>, Deque<E>, Cloneable, java.io.Serializable { // 单链表的大小.transient表示该属性不能被序列化. transient int size = 0; // 第一个结点 transient SingleNode<E> first; // 最后一个结点 transient SingleNode<E> last; static class SingleNode<E> { E item; SingleNode<E> next; SingleNode(E element, SingleNode<E> next) { this.item = element; this.next = next; } @Override public String toString() { return "SingleNode{" + "item=" + item + '}'; } } public SingleLinkedList() { } /** * 通过集合创建单链表 */ public SingleLinkedList(Collection<? extends E> c) { this(); addAll(c); } // 向链表中添加元素 public boolean add(E e) { linkLast(e); return true; } /** * 将e添加到链表的第一个位置 */ @Override public void addFirst(E e) { // TODO Auto-generated method stub linkFirst(e); } /** * 将e添加到链表的最后一个位置 */ @Override public void addLast(E e) { // TODO Auto-generated method stub linkLast(e); } /** * 链接第一个节点 * @param e */ private void linkFirst(E e) { SingleNode<E> f = first; SingleNode<E> newElement = new SingleNode<E>(e, f); first = newElement; if (f == null) { last = newElement; } // 链表的结点个数+1 size++; // 对链表修改的次数+1 modCount++; } @Override public boolean offerFirst(E e) { // TODO Auto-generated method stub return false; } @Override public boolean offerLast(E e) { // TODO Auto-generated method stub return false; } @Override public E removeFirst() { // TODO Auto-generated method stub return null; } @Override public E removeLast() { // TODO Auto-generated method stub return null; } @Override public E pollFirst() { // TODO Auto-generated method stub return null; } @Override public E pollLast() { // TODO Auto-generated method stub return null; } /** * 得到链表中的第一个元素 */ @Override public E getFirst() { // TODO Auto-generated method stub SingleNode<E> f = first; if (f == null) throw new NoSuchElementException(); return f.item; } public SingleNode<E> getFirstNode() { // TODO Auto-generated method stub SingleNode<E> f = first; if (f == null) throw new NoSuchElementException(); return f; } @Override public E getLast() { final SingleNode<E> l = last; if (l == null) throw new NoSuchElementException(); return l.item; } public SingleNode<E> getLastNode() { final SingleNode<E> l = last; if (l == null) throw new NoSuchElementException(); return l; } private E unlinkFirst(SingleNode<E> f) { // assert f == first && f != null; final E element = f.item; final SingleNode<E> next = f.next; f.item = null; f.next = null; // help GC first = next; if (next == null) last = null; size--; modCount++; return element; } @Override public E peekFirst() { // TODO Auto-generated method stub return null; } @Override public E peekLast() { // TODO Auto-generated method stub return null; } @Override public boolean removeFirstOccurrence(Object o) { // TODO Auto-generated method stub return false; } @Override public boolean removeLastOccurrence(Object o) { // TODO Auto-generated method stub return false; } @Override public boolean offer(E e) { // TODO Auto-generated method stub return false; } @Override public E remove() { // TODO Auto-generated method stub return null; } @Override public E poll() { // TODO Auto-generated method stub return null; } @Override public E element() { // TODO Auto-generated method stub return getFirst(); } /** * 查询第一个元素 */ @Override public E peek() { // TODO Auto-generated method stub final SingleNode<E> f = first; return (f == null) ? null : f.item; } @Override public void push(E e) { // TODO Auto-generated method stub } /** * 获得链表第一个元素,并从链表中移除该结点 */ @Override public E pop() { final SingleNode<E> f = first; return (f == null) ? null : unlinkFirst(f); } @Override public Iterator<E> descendingIterator() { // TODO Auto-generated method stub return null; } @Override public ListIterator<E> listIterator(int index) { // TODO Auto-generated method stub return null; } /** * 链表的元素大小 * @return */ @Override public int size() { // TODO Auto-generated method stub return size; } public boolean addAll(Collection<? extends E> c) { return addAll(size, c); } private boolean isPositionIndex(int index) { return index >= 0 && index <= size; } private String outOfBoundsMsg(int index) { return "Index: " + index + ", Size: " + size; } private void checkPositionIndex(int index) { if (!isPositionIndex(index)) throw new IndexOutOfBoundsException(outOfBoundsMsg(index)); } /** * 根据索引值得到结点 */ SingleNode<E> node(int index) { // assert isElementIndex(index); // >>位运算,size向右移动一位 SingleNode<E> x = first; for (int i = 0; i < index; i++) x = x.next; return x; } void linkLast(E e) { final SingleNode<E> l = last; final SingleNode<E> newNode = new SingleNode<E>(e, null); last = newNode; if (l == null) first = newNode; else l.next = newNode; size++; modCount++; } public boolean addAll(int index, Collection<? extends E> c) { checkPositionIndex(index); Object[] a = c.toArray(); int numNew = a.length; if (numNew == 0) return false; SingleNode<E> pred = null, succ; if (index == size) { succ = null; pred = last; } else { succ = node(index); } for (Object o : a) { @SuppressWarnings("unchecked") E e = (E) o; SingleNode<E> newNode = new SingleNode<E>(e, null); if (pred == null) { } else { pred.next = newNode; } pred = newNode; } if (succ == null) { last = pred; } else { pred.next = succ; } size += numNew; modCount++; return true; } @Override public String toString() { return "SingleLinkedList{" + "size=" + size + ", first=" + first + ", last=" + last + '}'; } }
测试程序
public class Problem24 { public static void main(String[] args){ Random random = new Random(); SingleLinkedList<Integer> list = new SingleLinkedList<Integer>(); //初始化单向链表 for(int i=0;i<10;i++){ int value = random.nextInt(10); list.add(value); } //颠倒链表 SingleLinkedList.SingleNode<Integer> firstNode = list.getFirstNode(); SingleLinkedList.SingleNode<Integer> currentNode = firstNode; SingleLinkedList.SingleNode<Integer> beforeNode = null; while(currentNode!=null&¤tNode.next!=null){ SingleLinkedList.SingleNode<Integer> nextNode = currentNode.next; currentNode.next = beforeNode; beforeNode = currentNode; currentNode = nextNode; } firstNode = list.getFirstNode(); System.out.println("Done!"+list.getLast()); } }
相关文章推荐
- 线性表11|单链表小结:腾讯面试题 - 数据结构和算法16
- 数据结构与算法面试题80道(16)
- 线性表11|单链表小结:腾讯面试题 - 数据结构和算法16
- 经典面试题(一)附答案 算法+数据结构+代码 微软Microsoft、谷歌Google、百度、腾讯
- 经典面试题(三)附答案 算法+数据结构+代码 微软Microsoft、谷歌Google、百度、腾讯
- 微软等数据结构+算法面试100题(16)--查找子串
- 微软的数据结构算法面试题(含答案)
- 经典面试题(一)附答案 算法+数据结构+代码 微软Microsoft、谷歌Google、百度、腾讯
- 微软等数据结构+算法面试100题(8)--华为面试题
- 经典面试题(四)附答案 算法+数据结构+代码 微软Microsoft、谷歌Google、百度、腾讯
- 线性表16:双向链表 - 数据结构和算法21
- 经典面试题(四)附答案 算法+数据结构+代码 微软Microsoft、谷歌Google、百度、腾讯
- 数据结构学习笔记 --- 线性表 (一些常见的关于链表的算法和面试题)
- 经典面试题(四)附答案 算法+数据结构+代码 微软Microsoft、谷歌Google、百度、腾讯
- 微软等数据结构+算法面试100题(10)--三道面试题
- 经典面试题(二)附答案 算法+数据结构+代码 微软Microsoft、谷歌Google、百度、腾讯
- 经典面试题(三)附答案 算法+数据结构+代码 微软Microsoft、谷歌Google、百度、腾讯
- 一步一步复习数据结构和算法基础-单链表冒泡排序
- 微软等数据结构+算法面试100题(47)-- 微软三道面试题
- 【算法和数据结构】_5_线性结构_单链表