for { // 从左向右遍历上边界 for i := left; i <= right; i++ { ret = append(ret, matrix[up][i]) } // 重新设定上边界 if up++; up > down { break } // 从上到下遍历右边界 for i := up; i <= down; i++ { ret = append(ret, matrix[i][right]) } // 重新设定右边界 if right--; right < left { break } //从右向左遍历下边界 for i := right; i >= left; i-- { ret = append(ret, matrix[down][i]) } // 重新设定下边界 if down--; down < up { break } // 从下到上遍历左边界 for i := down; i >= up; i-- { ret = append(ret, matrix[i][left]) } // 重新设定左边界 if left++; left > right { break } } return ret }
/** * Definition for singly-linked list. * type ListNode struct { * Val int * Next *ListNode * } */ funcreverseBetween(head *ListNode, left int, right int) *ListNode { var cur, reverseHead *ListNode // cur指向当前节点,reverseHead指向反转链表部分的第一个节点 cur = head // 使用栈记录反转部分的值Val stack := make([]int, right-left+1) top := 0// 栈顶指针
// 首先使cur指向left位置的节点 for i := 1; i < left; i++ { cur = cur.Next } reverseHead = cur // reverseHead指向反转链表部分的第一个节点
// 将第left位置~第right位置节点的值入栈 for i := left; i <= right; i++ { stack[top] = cur.Val top++ cur = cur.Next }
// 重新遍历left位置~第right位置节点,依次出栈并完成这段节点数值的反转 cur = reverseHead for i := left; i <= right; i++ { top-- cur.Val = stack[top] cur = cur.Next }
/** * Definition for singly-linked list. * type ListNode struct { * Val int * Next *ListNode * } */ funcreverseBetween(head *ListNode, left int, right int) *ListNode { newHead := &ListNode{} // 使链表带头节点 newHead.Next = head
cur, pre := head, newHead // cur指向当前遍历节点,pre指向cur的前驱 var leftPre *ListNode // leftPre指向第left位置节点的前驱 cur = head
// 首先使cur指向left位置的节点 for i := 1; i < left; i++ { pre = cur cur = cur.Next }
leftPre = pre
// left~right反转链表 for i := left; i < right; i++ { // 将cur.Next从链表上摘下 r := cur.Next // r指向cur的下一个节点 cur.Next = r.Next // 将r插入到leftPre之后(头插) r.Next = leftPre.Next leftPre.Next = r }