連結串列與棧——陣列入棧出棧、單鏈表翻轉
阿新 • • 發佈:2018-12-17
陣列入棧出棧
class Stack{ private Object[] data = new Object[0]; //棧的內容 private int size = 0; //棧的元素個數 public boolean isFull(){ //判斷棧是否滿 return data.length == size; } public boolean isEmpty(){ //判斷棧是否空 return size == 0; } public void addData(){ //擴容 data = Array.copyOf(data,data.length+10); } public void push(Object obj){ //入棧操作 if(isFull()){ addData(); } size++; data[size-1] = obj; } public Object pop(){ //出棧操作 Object o = data[size-1]; data[size-1] = null; size--; return o; } } public class stackTest{ public static void main(String[] args){ Stack s = new Stack(); s.push(1); s.push("123"); Objct o = s.pop(); System.out.println(o); } }
單鏈表翻轉
連結串列定義
class ListNode {
int val;
ListNode next;
ListNode(int x) {
val = x;
}
}
非遞迴實現很簡單,只需要遍歷一遍連結串列,在遍歷過程中,把遍歷的節點一次插入到頭部。
public ListNode reverseList(ListNode head) { ListNode prev = null; while(head!=null){ ListNode tmp = head.next; head.next = prev; prev = head; head = tmp; } return prev; }
遞迴實現:翻轉head->為首的連結串列, 然後head變為尾部節點
public ListNode reverseList(ListNode head) {
if(head==null||head.next ==null)
return head;
ListNode prev = reverseList(head.next);
head.next.next = head;
head.next = null;
return prev;
}